2012-04-13 10 views
12

Lo siento si esto parece una pregunta estúpida, pero he pasado la última media hora buscando en Internet y no puedo encontrar una respuesta a mi pregunta. Espero que esto se deba a que me he perdido algo realmente simple.XCode Cocoa App Preferences?

He creado una aplicación simple en XCode para Mac, construye y compila bien.

¿Cómo creo un menú para las preferencias? ¿Hay una manera fácil o tengo que crear una nueva interfaz? ¿Cómo puedo obtener y poner valores en estas preferencias?

Encontré un tutorial pero era para iOS, y por lo que puedo ver, el 'paquete de configuración' no está disponible si está desarrollando para Mac.

Gracias de antemano.

EDIT: El siguiente enlace es perfecto para esto: https://developer.apple.com/cocoa/cocoabindings.html

+3

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html#//apple_ref/doc/uid/10000059i-CH7-SW7 – mydogisbox

+0

gracias perfectos, tendrá una buena lectura – Cristian

+0

El enlace "EDITAR" ahora solo va a los documentos genéricos de Cocoa. Creo que este enlace es a lo que te refieres: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html –

Respuesta

15

This is the documentation you want. Más específicamente How to provide a Preferences Interface.

De todos modos, tendrá que hacer su propio menú/ventana de preferencias como lo haría con cualquier otra ventana, y tener algunos controles que permitan modificar los valores que luego se almacenan en el diccionario Predeterminado del usuario, que es donde las preferencias del usuario son generalmente almacenado (un proceso que Cocoa Bindings hace extremadamente fácil).

De lo contrario, manualmente, es probable que desee una referencia a [NSUserDefaults standardUserDefaults] para que pueda -setObject:ForKey: y así sucesivamente. Sería conveniente leer toda la documentación vinculada anteriormente (incluidas las otras secciones).

Para obtener más información sobre cómo se pueden utilizar las uniones de cacao para interactuar con NSUserDefaults para almacenar/recuperar preferencias, consulte los documentos de Apple here.

+2

también recomendaría el siguiente enlace para obtener paso a paso la creación del panel y los enlaces necesarios: https://developer.apple.com/cocoa/cocoabindings.html – Cristian

2
+0

la documentación muestra cómo sincronizar las preferencias con icloud que es no es lo que quiero, y muestra cómo obtener y establecer preferencias. Sin embargo, ¿no me dice cómo creo la ventana de preferencias y cómo vincularla? – Cristian

+2

Acabo de vincular la sección incorrecta, sigue siendo el mismo documento. Debería ser mejor ahora. – mydogisbox

+0

Esos documentos son algo incompletos. Tendrás que buscar en otro lado. –

6

Para la ventana en sí, recomendaría el marco RHPreferences.

Disponible en GitHub. BSD con licencia.

Es un controlador de ventana de preferencias simple y fácil con múltiples pestañas para su próxima aplicación Mac.

También proporciona:

  • cambio de tamaño automático entre diferentes vistas de tamaño de tabulación (con animación) de apoyo
  • NSToolbarItem personalizada
  • Persistencia de la última pestaña usada
  • Soporte para NSToolbarItems marcador de posición (por ejemplo NSToolbarFlexibleSpaceItemIdentifier & NSToolbarShowFontsItemIdentifier) ​​
+1

Si desea soporte de ARC, intente buscar a través de RHPreferences ' gráfico de red. Encontré este repositorio que convierte el proyecto en ARC y también incluye bloques de finalización para cambiar el tamaño de la ventana. https://github.com/vilhalmer/RHPreferences –

0

En MainMenu.xib de su proyecto, verá una lista desplegable después de hacer clic en el nombre de su aplicación. Cntrl + Click + Arrastra Preferences al archivo AppDelegate.h de tu proyecto y crea el método IBAction.

Crea una clase con NSWindowController (PreferenceWindowController) con xib, crea una propiedad fuerte de ese PreferenceWindowController, acéptalo y agrega [self.preferenceWindowController showWindow:self]; en AppDelegate.m. Esto creará una ventana de Preferences para su aplicación OS X.

0

Cree un .nib y un controlador (.h & .m) para cada uno de sus paneles de preferencias. Luego conéctelos dinámicamente en AppDelegate.m de su aplicación. Lo estoy usando en mi aplicación que consiste en un número de paquetes cargados dinámicamente de modo que cada paquete tenga sus propias preferencias.

Se puede ver un ejemplo muy bueno concisa aquí: http://www.knowstack.com/nstoolbar-sample-code-objectivec/

En este ejemplo, se crea dinámicamente el NSToolbar y la NSToolbarItem. Lo que haga en cada controlador de ventana para cada panel de preferencias depende de usted.

He aquí las principales partes del AppDelegate.m:

// AppDelegate.m 
// CocoaToolBars 
// Created by Debasis Das on 4/30/15. 
// Copyright (c) 2015 Knowstack. All rights reserved. 

#import "AppDelegate.h" 
@interface AppDelegate() 
@property (weak) IBOutlet NSWindow *window; 
@end 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 
    _toolbarTabsArray = [self toolbarItems]; 
    _toolbarTabsIdentifierArray = [NSMutableArray new]; 

    for (NSDictionary *dict in _toolbarTabsArray){ 
    [_toolbarTabsIdentifierArray addObject:dict[@"identifier"]]; 
    } 
    _toolbar = [[NSToolbar alloc] initWithIdentifier:@"ScreenNameToolbarIdentifier"]; 
    _toolbar.allowsUserCustomization = YES; 
    _toolbar.delegate = self; 
    self.window.toolbar = _toolbar; 
} 

-(NSArray *)toolbarItems { 
    NSArray *toolbarItemsArray = [NSArray arrayWithObjects: 
           [NSDictionary dictionaryWithObjectsAndKeys:@"Find Departments",@"title",@"Department-50",@"icon",@"DepartmentViewController",@"class",@"DepartmentViewController",@"identifier", nil], 
           [NSDictionary dictionaryWithObjectsAndKeys:@"Find Accounts",@"title",@"Business-50",@"icon",@"AccountViewController",@"class",@"AccountViewController",@"identifier", nil], 
           [NSDictionary dictionaryWithObjectsAndKeys:@"Find Employees",@"title",@"Edit User-50",@"icon",@"EmployeeViewController",@"class",@"EmployeeViewController",@"identifier", nil], 
           nil]; 
    return toolbarItemsArray; 
} 

- (void)applicationWillTerminate:(NSNotification *)aNotification { 
    // Insert code here to tear down your application 
} 

- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar 
    itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { 
    NSDictionary *itemInfo = nil; 

    for (NSDictionary *dict in _toolbarTabsArray) { 
    if([dict[@"identifier"] isEqualToString:itemIdentifier]) { 
     itemInfo = dict; 
     break; 
    } 
    } 

    NSAssert(itemInfo, @"Could not find preferences item: %@", itemIdentifier); 

    NSImage *icon = [NSImage imageNamed:itemInfo[@"icon"]]; 
    if(!icon) { 
    icon = [NSImage imageNamed:NSImageNamePreferencesGeneral]; 
    } 
    NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; 
    item.label = itemInfo[@"title"]; 
    item.image = icon; 
    item.target = self; 
    item.action = @selector(viewSelected:); 
    return item; 
} 

-(void)viewSelected:(id)sender { 
    NSToolbarItem *item = sender; 
    [self loadViewWithIdentifier:item.itemIdentifier withAnimation:YES]; 
} 

-(void)loadViewWithIdentifier:(NSString *)viewTabIdentifier 
         withAnimation:(BOOL)shouldAnimate { 
    NSLog(@"viewTabIdentifier %@",viewTabIdentifier); 

    if ([_currentView isEqualToString:viewTabIdentifier]) { 
    return; 
    } else { 
    _currentView = viewTabIdentifier; 
    } 
    //Loop through the view array and find out the class to load 

    NSDictionary *viewInfoDict = nil; 
    for (NSDictionary *dict in _toolbarTabsArray) { 
    if ([dict[@"identifier"] isEqualToString:viewTabIdentifier]) { 
     viewInfoDict = dict; 
     break; 
    } 
    } 
    NSString *class = viewInfoDict[@"class"]; 
    if(NSClassFromString(class)) { 
    _currentViewController = [[NSClassFromString(class) alloc] init]; 
    NSView *newView = _currentViewController.view; 

    NSRect windowRect = self.window.frame; 
    NSRect currentViewRect = newView.frame; 

    windowRect.origin.y = windowRect.origin.y + (windowRect.size.height - currentViewRect.size.height); 
    windowRect.size.height = currentViewRect.size.height; 
    windowRect.size.width = currentViewRect.size.width; 

    self.window.title = viewInfoDict[@"title"]; 
    [self.window setContentView:newView]; 
    [self.window setFrame:windowRect display:YES animate:shouldAnimate];  
    } else { 
    NSAssert(false, @"Couldn't load %@", class); 
    } 
} 

- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar { 
    NSLog(@"%s %@",__func__,_toolbarTabsIdentifierArray); 
    return _toolbarTabsIdentifierArray; 
} 

- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar { 
    NSLog(@"%s",__func__); 
    return [self toolbarDefaultItemIdentifiers:toolbar]; 
} 

- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar { 
    NSLog(@"%s",__func__); 
return [self toolbarDefaultItemIdentifiers:toolbar]; 
} 

- (void)toolbarWillAddItem:(NSNotification *)notification { 
    NSLog(@"%s",__func__); 
} 

- (void)toolbarDidRemoveItem:(NSNotification *)notification { 
    NSLog(@"%s",__func__); 
} 

@end 
Cuestiones relacionadas