2016-07-15 2 views
0

現在、Macアプリケーションを作成しようとしています。そうすることで、NSToolbarをセットアップしようとするときにいくつかの問題が発生します。NSToolbarをプログラムで作成すると空になり、保存されません

APIのドキュメントに従ってすべてのコンポーネントをセットアップしましたが、アプリケーションがロードされるとツールバーは常に空になります。カスタマイズ・ペインを開くとツールバーの項目が表示され、ツールバーにドラッグできますが、アプリケーションを終了して再起動すると変更が消えてしまいます。

注:私は、この問題を解決する最善の方法はコードで行うのではなく、インターフェイスビルダーを使用することだと多くの意見があります。それは私が探している答えではありません。私は、Cocoaアプリケーションの内部をよりよく理解するために、IBなしでこのアプリケーションを作成することを選択しました。

私はtoolbarAllowedItemIdentifierstoolbarDefaultItemIdentifiersデリゲートメソッドのどちらも、ツールバーが最初に初期化されたときに呼び出されないが、カスタマイズペインを入力したときに呼び出されることをNSLogsで確認しました。

以下、このバグを示す基本的なアプリの最小限で検証可能で完全なサンプルバージョンを見つけてください。この問題についていくつかの光を当てることができる誰もが大いに感謝します!

おかげ

Defines.h

#define UNUSED(x) (void)(x) 
#define TOOLBAR_ONE @"ONE" 
#define TOOLBAR_TWO @"TWO" 
#define TOOLBAR_IDENT @"TOOLBAR" 

#define WINDOW_MASK NSTitledWindowMask | \ 
    NSClosableWindowMask | \ 
    NSResizableWindowMask | \ 
    NSMiniaturizableWindowMask 

main.m

#import "BWAppDelegate.h" 
#import <AppKit/AppKit.h> 

int main(void) { 
    @autoreleasepool { 
     NSApplication* application = [NSApplication sharedApplication]; 
     BWAppDelegate* delegate = [[BWAppDelegate alloc] init]; 

     application.delegate = delegate; 
     [application run]; 

     return EXIT_SUCCESS; 
    } 
} 

BWAppDelegate.h

#import <Cocoa/Cocoa.h> 

#import "BWMainToolbarDelegate.h" 

@interface BWAppDelegate : NSObject<NSApplicationDelegate> 

@property (atomic, strong) NSWindow*    window; 
@property (atomic, strong) BWMainToolbarDelegate* toolbarDelegate; 

@end 

BWAppDelegate.m

#import <AVFoundation/AVFoundation.h> 
#import <AppKit/AppKit.h> 
#import <Cocoa/Cocoa.h> 

#import "BWAppDelegate.h" 
#import "Defines.h" 

@implementation BWAppDelegate 

@synthesize window, toolbarDelegate; 

- (void) applicationDidFinishLaunching: (NSNotification*) aNotification 
{ 
    UNUSED(aNotification); 
    NSRect dims = NSMakeRect(0, 0, 300, 300); 

    self.window = [[NSWindow alloc] initWithContentRect:dims 
              styleMask:WINDOW_MASK 
               backing:NSBackingStoreBuffered 
               defer:NO]; 
    [self.window makeKeyAndOrderFront:nil]; 
    self.window.toolbar = [[NSToolbar alloc] initWithIdentifier:TOOLBAR_IDENT]; 
    toolbarDelegate  = [[BWMainToolbarDelegate alloc] initWithToolbar:self.window.toolbar]; 
} 

@end 

BWMainToolbarDelegate.h

#import <AppKit/AppKit.h> 
#import <Foundation/Foundation.h> 

@interface BWMainToolbarDelegate : NSObject<NSToolbarDelegate> 

- (instancetype) initWithToolbar: (NSToolbar*) theToolbar; 

- (NSArray*) toolbarAllowedItemIdentifiers: (NSToolbar*) toolbar; 
- (NSArray*) toolbarDefaultItemIdentifiers: (NSToolbar*) toolbar; 
- (NSToolbarItem*) toolbar: (NSToolbar*) toolbar 
     itemForItemIdentifier: (NSString*) identifier 
    willBeInsertedIntoToolbar: (BOOL) flag; 

@end 

BWMainToolbarDelegate.m

#import "BWMainToolbarDelegate.h" 
#import "Defines.h" 

@implementation BWMainToolbarDelegate { 
    NSToolbar* toolbar; 
} 

- (instancetype) initWithToolbar: (NSToolbar*) theToolbar 
{ 
    self = [super init]; 
    if(self) { 
     toolbar = theToolbar; 
     toolbar.displayMode = NSToolbarDisplayModeIconAndLabel; 
     toolbar.allowsUserCustomization = YES; 
     toolbar.autosavesConfiguration = YES; 
     toolbar.delegate = self; 
    } 
    return self; 
} 

- (NSArray*) toolbarAllowedItemIdentifiers: (NSToolbar*) theToolbar 
{ 
    UNUSED(theToolbar); 
    return @[TOOLBAR_ONE, TOOLBAR_TWO]; 
} 

- (NSArray*) toolbarDefaultItemIdentifiers: (NSToolbar*) theToolbar 
{ 
    UNUSED(theToolbar); 
    return @[TOOLBAR_ONE, TOOLBAR_TWO]; 
} 

- (NSToolbarItem*) toolbar: (NSToolbar*) theToolbar 
     itemForItemIdentifier: (NSString*) identifier 
    willBeInsertedIntoToolbar: (BOOL) flag 
{ 
    UNUSED(flag); 
    NSToolbarItem* returnVal = nil; 
    NSString*  label; 

    if([theToolbar.identifier isEqualToString:TOOLBAR_IDENT]) { 

     if([identifier isEqualToString:TOOLBAR_ONE]) { 
     returnVal = [[NSToolbarItem alloc] initWithItemIdentifier:TOOLBAR_ONE]; 
     label  = @"Toolbar One"; 
     } else if([identifier isEqualToString:TOOLBAR_TWO]) { 
     returnVal = [[NSToolbarItem alloc] initWithItemIdentifier:TOOLBAR_TWO]; 
     label  = @"Toolbar TWO"; 
     } 
    } 

    returnVal.label  = label; 
    returnVal.paletteLabel = label; 
    return returnVal; 
} 

@end 

答えて

6

ウィンドウにツールバーを追加する前に、ツールバーのデリゲートを設定します。

+1

ああ私の神!私はそれが簡単だとは信じられません...あなたが何時間も間違っていたことを解決するために費やした時間は分かりません。ありがとう! –

関連する問題