2012-04-13 46 views
12

Xin lỗi nếu điều này có vẻ như một câu hỏi ngu ngốc, nhưng tôi đã dành nửa giờ tìm kiếm trên Internet và không thể tìm thấy câu trả lời cho câu hỏi của tôi. Tôi hy vọng điều này là bởi vì tôi đã bỏ lỡ một cái gì đó thực sự đơn giản.Tùy chọn ứng dụng ca cao XCode?

Tôi đã tạo một ứng dụng đơn giản trong XCode cho Mac, nó xây dựng và biên dịch tốt.

Làm cách nào để tạo menu cho tùy chọn? Có cách nào dễ dàng hay tôi phải tạo giao diện mới? Làm thế nào để tôi nhận được và đưa các giá trị vào các sở thích này?

Tôi đã tìm thấy một hướng dẫn nhưng nó dành cho iOS và từ những gì tôi có thể thấy 'Gói cài đặt' không khả dụng nếu bạn đang phát triển cho Mac.

Xin cảm ơn trước.

EDIT: Các liên kết sau là hoàn hảo cho việc này: 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

cảm ơn hoàn hảo, sẽ có kết nối tốt qua – Cristian

+0

Liên kết "CHỈNH SỬA" hiện chỉ cần chuyển đến tài liệu Cocoa chung. Tôi nghĩ rằng liên kết này là những gì bạn đang đề cập đến: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html –

Trả lời

15

This is the documentation you want. Cụ thể hơn How to provide a Preferences Interface. Dù sao đi nữa, bạn sẽ phải tạo một menu/cửa sổ tùy chọn của riêng bạn như bất kỳ cửa sổ nào khác và có một số điều khiển cho phép sửa đổi các giá trị sau đó được lưu trữ trong từ điển mặc định người dùng. thường được lưu trữ (một quá trình mà Cocoa Bindings làm cho cực kỳ dễ dàng).

Nếu không, theo cách thủ công, bạn có thể muốn tham chiếu đến [NSUserDefaults standardUserDefaults] để bạn có thể -setObject:ForKey: v.v. Nó sẽ là khôn ngoan để đọc toàn bộ tài liệu liên quan đến ở trên (bao gồm cả các phần khác).

Để biết thêm thông tin về cách Bindings Cocoa có thể được sử dụng để giao tiếp với NSUserDefaults để lưu trữ/truy xuất tùy chọn, hãy xem tài liệu của Apple here.

+2

cũng muốn giới thiệu liên kết sau cho từng bước tạo bảng điều khiển và các ràng buộc cần thiết: https://developer.apple.com/cocoa/cocoabindings.html – Cristian

2
+0

tài liệu hướng dẫn cách hiển thị tùy chọn đồng bộ hóa với icloud không phải những gì tôi muốn, và nó cho thấy làm thế nào để có được và thiết lập sở thích. Tuy nhiên, nó không cho tôi biết cách tôi tạo cửa sổ tùy chọn và cách liên kết nó? – Cristian

+2

Tôi vừa liên kết phần sai, vẫn là tài liệu giống nhau. Nên tốt hơn bây giờ. – mydogisbox

+0

Các tài liệu đó hơi sơ sài. Bạn sẽ cần phải tìm nơi khác. –

6

Đối với chính cửa sổ, tôi muốn giới thiệu khung RHPreferences.

Có sẵn trên GitHub. BSD được cấp phép.

Bộ điều khiển cửa sổ Tùy chọn đơn giản và dễ dàng với nhiều tab cho ứng dụng Mac tiếp theo của bạn.

Nó cũng cung cấp:

  • Auto thay đổi kích thước giữa các quan điểm tab kích thước khác nhau (Với hình ảnh động) hỗ trợ
  • Tuỳ chỉnh NSToolbarItem
  • Persistence của tab đã qua sử dụng cuối cùng
  • Hỗ trợ cho NSToolbarItems giữ chỗ (ví dụ NSToolbarFlexibleSpaceItemIdentifier & NSToolbarShowFontsItemIdentifier) ​​
+1

Nếu bạn muốn hỗ trợ ARC, hãy thử tìm kiếm thông qua RHPreferences ' biểu đồ mạng. Tôi tìm thấy repo này chuyển đổi dự án thành ARC và cũng bao gồm các khối hoàn thành để thay đổi kích thước cửa sổ. https://github.com/vilhalmer/RHPreferences –

0

Trong MainMenu.xib của dự án của bạn, bạn sẽ thấy danh sách thả xuống sau khi bạn nhấp vào tên ứng dụng của mình. Cntrl + Nhấp vào + Kéo Preferences vào tệp AppDelegate.h của dự án của bạn và tạo và phương thức IBAction.

Tạo lớp học với NSWindowController (PreferenceWindowController) với xib, tạo thuộc tính mạnh mẽ của PreferenceWindowController đó, cấp phát init và thêm [self.preferenceWindowController showWindow:self]; trong AppDelegate.m. Thao tác này sẽ tạo một cửa sổ Preferences cho ứng dụng OS X của bạn.

0

Tạo .nib và bộ điều khiển (.h & .m) cho mỗi khung tùy chọn của bạn. Sau đó, kết nối chúng một cách linh hoạt trong AppDelegate.m của ứng dụng của bạn. Tôi đang sử dụng ứng dụng trong ứng dụng của mình bao gồm một số gói được tải động như vậy mà mỗi gói có tùy chọn riêng.

Bạn có thể thấy một ví dụ ngắn gọn thực sự tốt ở đây: http://www.knowstack.com/nstoolbar-sample-code-objectivec/

Trong ví dụ này, nó tự động tạo ra NSToolbar và NSToolbarItem. Việc bạn làm trong mỗi bộ điều khiển cửa sổ cho mỗi khung tùy chọn tùy thuộc vào bạn.

Dưới đây là các bộ phận chính của 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 
Các vấn đề liên quan