2012-04-13 4 views
12

Извините, если это кажется глупым вопросом, но я провел последние полчаса в Интернете и не могу найти ответ на мой вопрос. Я надеюсь, что это потому, что я пропустил что-то очень простое.Настройки приложения XCode Cocoa?

Я создал простую программу в XCode для Mac, она строит и компилирует в порядке.

Как создать меню настроек? Есть ли простой способ или мне нужно создать новый интерфейс? Как мне получить и поместить значения в эти настройки?

Я нашел один учебник, но это было для iOS, и из того, что я вижу, «Пакет настроек» недоступен, если вы разрабатываете для Mac.

Заранее спасибо.

EDIT: Ниже ссылка идеально подходит для этого: 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

безукоризненное спасибо, будет иметь хорошее прочтение – Cristian

+0

Ссылка «EDIT» теперь просто переходит к общим документам Cocoa. Я думаю, что эта ссылка - это то, о чем вы говорите: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html –

ответ

15

This is the documentation you want. Более конкретно How to provide a Preferences Interface.

Во всяком случае, вам нужно будет создать собственное меню/окно настроек, так как вы сделаете любое другое окно и имеете некоторые элементы управления, которые позволяют изменять значения, которые затем сохраняются в словаре пользовательских настроек по умолчанию, в котором пользовательские настройки (процесс, который Cocoa Bindings делает чрезвычайно простым).

В противном случае, вам, вероятно, понадобится ссылка на [NSUserDefaults standardUserDefaults], чтобы вы могли -setObject:ForKey: и так далее. Было бы разумно прочитать всю документацию, связанную с выше (включая другие разделы).

Дополнительную информацию о том, как привязки Cocoa можно использовать для связи с NSUserDefaults для сохранения/получения настроек, см. В документах Apple here.

+2

также хотел бы порекомендовать следующую ссылку для создания панели и необходимых привязок: https://developer.apple.com/cocoa/cocoabindings.html – Cristian

2
+0

В документации показано, как синхронизировать настройки с icloud, который не то, что я хочу, и он показывает, как получить и установить предпочтения. Однако он не говорит мне, как я создаю окно настроек и как его связывать? – Cristian

+2

Я только что связал неправильный раздел, все тот же документ. Должно быть лучше сейчас. – mydogisbox

+0

Эти документы несколько отрывочны. Вам нужно искать в другом месте. –

6

Для самого окна я бы рекомендовал раму RHPreferences.

Доступно на GitHub. Лицензия BSD.

Его простой и легкий контроллер окон настроек с несколькими вкладками для вашего следующего приложения Mac.

Он также обеспечивает:

  • Автоматическое изменение размера между различными размерами просмотров вкладки (с анимацией) поддержка
  • Пользовательские NSToolbarItem
  • персистенции последняя закладка
  • Поддержка заполнителей NSToolbarItems (например NSToolbarFlexibleSpaceItemIdentifier & NSToolbarShowFontsItemIdentifier) ​​
+1

Если вы хотите поддержку ARC, попробуйте выполнить поиск через RHPreferences ' сетевой график. Я нашел это репо, которое преобразует проект в ARC, а также включает блоки завершения для изменения размера окна. https://github.com/vilhalmer/RHPreferences –

0

В MainMenu.xib вашего проекта вы увидите раскрывающийся список после нажатия на название вашего приложения. Cntrl + Click + Перетащите Preferences в файл проекта AppDelegate.h и создайте метод IBAction.

Создайте класс с NSWindowController (PreferenceWindowController) с помощью xib, создайте сильное свойство этого PreferenceWindowController, выделите его и добавьте [self.preferenceWindowController showWindow:self]; в AppDelegate.m. Это создаст окно Preferences для вашего приложения OS X.

0

Создайте .nib и контроллер (.h & .m) для каждой из ваших панелей предпочтений. Затем подключите их динамически в AppDelegate.m вашего приложения. Я использую его в своем приложении, которое состоит из числа динамически загруженных пакетов, так что каждый комплект имеет свои собственные предпочтения.

Вы можете увидеть действительно хороший краткий пример здесь: http://www.knowstack.com/nstoolbar-sample-code-objectivec/

В этом примере, он динамически создает NSToolbar и NSToolbarItem. Что вы делаете в каждом оконном контроллере для каждой панели предпочтений, зависит от вас.

Вот основные части 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 
Смежные вопросы