Подтвердить что ты не робот

XCode Cocoa Настройки приложения?

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

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

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

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

Спасибо заранее.

EDIT: Следующая ссылка идеально подходит для этого: https://developer.apple.com/cocoa/cocoabindings.html

4b9b3361

Ответ 1

Это документация, которую вы хотите. Более конкретно Как обеспечить интерфейс настроек.

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

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

Дополнительные сведения о том, как Cocoa Bindings можно использовать для взаимодействия с NSUserDefaults для сохранения/получения настроек, см. в документах Apple здесь.

Ответ 2

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

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

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

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

  • Автоматическое изменение размера между представлениями разных размеров (с анимацией)
  • Пользовательская поддержка NSToolbarItem.
  • Сохранение последней используемой вкладки
  • Поддержка элементов-заполнителей NSToolbarItems (например, NSToolbarFlexibleSpaceItemIdentifier и NSToolbarShowFontsItemIdentifier) ​​

Ответ 4

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

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

Ответ 5

Создайте .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