2012-04-13 20 views
12

Scusa se questa sembra una domanda stupida, ma ho passato l'ultima mezz'ora a cercare su Internet e non riesco a trovare una risposta alla mia domanda. Spero che questo sia perché mi sono perso qualcosa di veramente semplice.Preferenze XCode Cocoa App?

Ho creato una semplice app in XCode per Mac, costruisce e compila bene.

Come si crea un menu per le preferenze? C'è un modo semplice o devo creare una nuova interfaccia? Come posso quindi ottenere e inserire valori in queste preferenze?

Ho trovato un tutorial ma era per iOS, e da quello che posso vedere il "Impostazioni bundle" non è disponibile se stai sviluppando per Mac.

Grazie in anticipo.

EDIT: Il seguente link è perfetto per questo: 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

perfetti grazie, avrà una buona lettura – Cristian

+0

Il link "EDIT" ora va solo ai documenti Cocoa generici. Penso che questo link sia quello a cui ti stai riferendo: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html –

risposta

15

This is the documentation you want. Più specificamente How to provide a Preferences Interface.

In ogni caso, è necessario creare il proprio menu/finestra delle preferenze come si farebbe con qualsiasi altra finestra e disporre di alcuni controlli che consentono di modificare i valori che vengono quindi memorizzati nel dizionario User Defaults, che è dove le preferenze dell'utente sono di solito memorizzato (un processo che Cocoa Bindings rende estremamente facile).

Altrimenti, manualmente, si vorrebbe probabilmente un riferimento a [NSUserDefaults standardUserDefaults] in modo da poter -setObject:ForKey: e così via. Sarebbe saggio leggere l'intera documentazione collegata sopra (comprese le altre sezioni).

Per ulteriori informazioni su come utilizzare Cocoa Bindings per interfacciare con NSUserDefaults per memorizzare/recuperare le preferenze, consultare la documentazione Apple here.

+2

vorrebbe anche raccomandare il seguente collegamento per un passo dopo passo sulla creazione del pannello e le associazioni necessarie: https://developer.apple.com/cocoa/cocoabindings.html – Cristian

2
+0

la documentazione mostra come sincronizzare le preferenze con icloud che è non quello che voglio, e mostra come ottenere e impostare le preferenze. Tuttavia, non mi dice come creo la finestra delle preferenze e come collegarla? – Cristian

+2

Ho appena collegato la sezione sbagliata, sempre lo stesso documento. Dovrebbe essere migliore ora. – mydogisbox

+0

Questi documenti sono piuttosto approssimativi. Avrai bisogno di cercare altrove. –

6

Per la finestra stessa, vorrei raccomandare il framework RHPreferences.

Disponibile su GitHub. Licenza BSD.

È un controller di finestra Preferenze semplice e semplice con più schede per la tua prossima applicazione Mac.

Fornisce inoltre:

  • Auto ridimensionamento tra i diversi punti di vista di dimensioni della scheda (con animazione)
  • personalizzato NSToolbarItem supporto
  • Persistenza della ultima scheda utilizzata
  • Supporto per NSToolbarItems segnaposto (ad esempio NSToolbarFlexibleSpaceItemIdentifier & NSToolbarShowFontsItemIdentifier) ​​
+1

Se si desidera il supporto ARC, provare a cercare attraverso RHPreferences ' grafico di rete. Ho trovato questo repo che converte il progetto in ARC e include anche blocchi di completamento per ridimensionare la finestra. https://github.com/vilhalmer/RHPreferences –

0

In MainMenu.xib del tuo progetto, vedrai un elenco a discesa dopo aver fatto clic sul nome della tua app. Cntrl + Clic + Trascina Preferences nel file AppDelegate.h del tuo progetto e crea e metodo IBAction.

Creare una classe con NSWindowController (PreferenceWindowController) con xib, creare una proprietà di tale PreferenceWindowController, allocarlo init e aggiungere [self.preferenceWindowController showWindow:self]; in AppDelegate.m. Questo creerà una finestra di Preferences per la tua app OS X.

0

Creare un .nib e un controller (.h & .m) per ciascuno dei riquadri delle preferenze. Quindi collegali dinamicamente in AppDelegate.m della tua app. Lo sto usando nella mia app che consiste in un numero di pacchetti caricati dinamicamente in modo tale che ogni bundle ha le sue preferenze.

Si può vedere un buon esempio concisa qui: http://www.knowstack.com/nstoolbar-sample-code-objectivec/

In questo esempio, si crea dinamicamente la NSToolbar e NSToolbarItem. Quello che fai in ogni finestra del controller per ogni pannello delle preferenze dipende da te.

Ecco le principali parti 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 
Problemi correlati