2012-09-15 83 views
1

我嘗試了許多可能性,我在這個網站上發現並從蘋果開發者頁面閱讀了一些解釋 ,但似乎我無法解決我的問題 加載NSViewController /表單NIB。Cocoa:用nib加載NSViewController

文件上的Xcode的項目看起來有點像這樣:

  • SecondViewController.h
  • SecondViewController.m
  • SecondViewController.xib
  • AppDelegate.h
  • AppDelegate.m
  • MainMenu.xib

主要的問題是我如何編程創建SecondViewController與 上SecondViewController.xib初始筆尖

  • 上MainMenu.xib自定義類FileOwner是的NSApplication
  • 定製類FileOwner對SecondViewController .xib是SecondViewController
  • MainMenu.xb中有一些面板和窗口(關於窗口和偏好面板)
  • 此應用程序沒有主窗口(使用通知圖標狀態欄)

SecondViewController.h

@interface SecondViewController : NSViewController { 
    BOOL fullScreenMode; 
    NSImageView *fullScreenbg; 
    NSImageView *imageView1; 
    NSImageView *imageView2; 
    NSPanel *imageWindow; 

} 


@property (assign) IBOutlet NSImageView *fullScreenbg; 
@property (assign) IBOutlet NSImageView *imageView1; 
@property (assign) IBOutlet NSImageView *imageView2; 
@property (assign) IBOutlet NSPanel *imageWindow; 

SecondViewController.m

@implementation SecondViewController { 
    NSImageView *nv1; 
    NSImageView *nv2; 
    NSSize curImgSize; 
} 

@synthesize fullScreenbg; 
@synthesize imageView1; 
@synthesize imageView2; 
@synthesize imageWindow; 

...... 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Initialization code here. 
     fullScreenMode = YES; 
    } 

    return self; 
} 

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate,NSWindowDelegate> { 
    NSPanel *aboutWindow; 
    IBOutlet NSMenu *myStatusMenu; 
    IBOutlet NSMenuItem *toggleFullScreen; 
} 

AppDelegate.m

@implementation AppDelegate { 
    SecondViewController *controller; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    controller = [[SecondViewController alloc] 
       initWithNibName:@"SecondViewController" 
       bundle:nil]; 
    //Not work (fullscreenbg, imageView1, imageView2,imageWindow = nil) 

    //controller = [[SecondViewController alloc] init]; ?? <-- didn't work either 
} 

即使使用initWithNibName或者只是初始化,所有IBOutlet屬性在調試時似乎都沒有 。我試過其他的解決方案,如「NSBundle loadNibNamed」或using loadView,但它沒有工作(警告消息:「NSObject我沒有響應loadView」)。

secondViewController的主要目的是顯示通知消息,包括 圖形和Web元素。

我希望有人能給我一個最好的建議。謝謝。

+0

在你的NSViewController的初始化過程中設置一個斷點,看看你是否實際初始化它。 – TheAmateurProgrammer

+0

當然。執行appdelegate時的初始化,在執行第二個控制器時的initwithnibname,控制器不是零/空,但所有控制器出口都是零/空。 – theodorusap

+0

只有網點?你是否手動設置網點?如果是,請嘗試將它們設置在awakeFromNib中。 – TheAmateurProgrammer

回答

-1
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    //added this line : 
    if (nibBundleOrNil!=nil || ![nibBundleOrNil isEqualtoString:@""]) { 
     [NSBundle loadNibNamed:@"SecondViewController" owner:self]; 
    { 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Initialization code here. 
     fullScreenMode = YES; 
    } 

    return self; 
} 
+0

之前你可以將自己的答案標記爲正確的答案,這也會給你15個代表。 – TheAmateurProgrammer

0

這是正常行爲。 IBOutlets在構造函數中沒有連接。

您可以重寫viewDidLoad,調用super,然後執行任何初始化。