2011-09-22 66 views
11

我絆倒了一些基本概念,我無法掌握。我希望有人能爲我清理一些東西,因爲我找不到任何資源,這就可以解釋這一點。或者,也許,這是在明亮的開放,我只是沒有看到它。將視圖或窗口添加到MainWindow中

瞭解到目前爲止:MainWindow擁有菜單,因此或多或少是必不可少的。該info.plist持有的筆尖,這是在appstart上加載。

到目前爲止還不是很瞭解:我正在嘗試單個窗口應用程序。我可以在appDelegate中完成所有工作(到目前爲止工作正常),並且我可以有一個額外的控制器,以便我可以將MainWindow中的UIElements連接到(儘管工作良好)。但是:我真正想要做的是擁有一個MainWIndow,它只有菜單,還有一個單獨的控制器和筆尖(可能甚至多於一個),隨後加載和添加。

我的問題:

  • 使用NSWindowControllerNSViewController?爲什麼? (我會使用NSViewController

  • 什麼,在哪裏以及如何實例化(大概在的appDelegate的didFinishLaunching?)

  • 如何窗口或視圖添加到獨一無二的主窗口,而不是有一個獨立的第二個窗口(我還沒有申請多文檔應用程序)

謝謝!

回答

22

到目前爲止還不是很瞭解:我正在嘗試單個窗口應用程序。我可以在appDelegate中完成所有工作(到目前爲止工作正常),並且我可以有一個額外的控制器,以便我可以將UIElements從MainWindow連接到(儘管工作良好)。但是:我真正想要做的是擁有一個MainWIndow,它只有菜單,還有一個單獨的控制器和筆尖(可能甚至多於一個),隨後加載和添加。

爲了清楚起見,MainWindow是一個nib文件,所以我將它稱爲MainWindow.nib。它是在應用程序的Info.plist文件中指定的標準nib文件名,作爲應用程序啓動時要加載的nib文件。

默認情況下,Xcode創建一個包含主菜單和主窗口的MainWindow.nib文件。您可以從MainWindow.nib文件中自由刪除窗口,並有另一個nib文件來保存該窗口。我們來調用這個其他的nib文件MyWindow.nib。

使用NSWindowController或NSViewController?爲什麼? (我傾向於的viewController)

既然你將有一個單獨的榫文件來保存一個窗口,您將使用NSWindowController。創建NSWindowController的子類,例如MyWindowController,它將負責控制存儲在MyWindow.nib中的窗口。這個子類將有指向該窗口中的用戶界面元素的出口,以及可能在MyWindow.nib中定義的其他對象。

這樣做時,在MyWindow中執行以下操作很重要。筆尖:

  • 將文件的所有者設置爲MyWindowController;

  • 將文件所有者的window插座連接到窗口對象。

NSViewController用於管理視圖,通常從筆尖文件加載,它並不適用於窗口。

您可以在.nib文件中重複這個窗口,NSWindowController的子類來管理該窗口 - 根據需要設置多個窗口。

什麼,在哪裏以及如何實例化(大概在的appDelegate的didFinishLaunching?)

既然你想在你的應用程序中的一個窗口,一個選項是爲您的應用程序委託持有的引用(實例變量,聲明的屬性)到管理該窗口的單個窗口控制器。然後,在-applicationDidFinishLaunching:中,實例化所述控制器。

例如:

// MyAppDelegate.h 

@class MyWindowController; 

@interface MyAppDelegate : NSObject <NSApplicationDelegate> 
@property (retain) MyWindowController *myWindowController; 
@end 

和:

// MyAppDelegate.m 

#import "MyAppDelegate.h" 
#import "MyWindowController.h" 

@implementation MyAppDelegate 

@synthesize myWindowController; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    self.myWindowController = [[[MyWindowController alloc] 
     initWithWindowNibName:@"MyWindow"] autorelease]; 
    [self.myWindowController showWindow:self]; 
} 

… 
@end 

如果你想要更多的窗口,它只是一個聲明實例變量/屬性,以保持其相應的控制器和實例化控制器像上面的事。

如何窗口或視圖添加到獨一無二的主窗口,而不是具有第二,獨立的窗口(我還沒有彌補multiDocumentApps)

您確定要在主窗口中添加一個窗口?如果是這樣,那將被稱爲附加窗口。你可以使用上面的機制(把窗口放在它自己的nib文件中,有一個NSWindowController的子類來管理它,讓你原來的MyWindowController把一個引用(實例變量,聲明的屬性)保存到附加的窗口控制器,並實例化它/ load隨附的窗口筆尖文件),然後使用-[NSWindow - addChildWindow:ordered:]將輔助窗口附加到主窗口。

例如,考慮MyWindowController具有聲明的屬性secondaryWindowController,在MyWindowController.m:

- (void)someAction:(id)sender { 
    // If the secondary window hasn't been loaded yet, load it and add its 
    // window as a window attached to the main window 
    if (self.secondaryWindowController == nil) { 
     self.secondaryWindowController = [[[MySecondaryWindowController alloc] 
      initWithWindowNibName:@"MySecondaryWindow"] autorelease]; 
     [[self window] addChildWindow:self.secondaryWindowController.window 
           ordered:NSWindowAbove]; 
    } 
} 

如果你想一個視圖添加到主窗口中,最簡單的方法是在筆尖文件這樣做直。

如果您需要/想以編程方式做到這一點,你需要有對視圖的引用,然後將其添加到主窗口中的內容視圖,例如:

[self.window.contentView addSubView:someView]; 

可以通過編程方式創建或負載它來自一個單獨的nib文件。在後一種情況下,該過程非常類似於上面描述的過程,但不使用NSWindowController的子類,而是使用NSViewController的子類。

例如,在MyWindowController.m:

- (void)anotherAction:(id)sender { 
    // If the view hasn't been loaded yet, load it and add it 
    // as a subview of the main window's content view 
    if (self.someViewController == nil) { 
     self.someViewController = [[[MyViewController alloc] 
      initWithNibName:@"MyView" bundle:nil] autorelease]; 
     // You'll probably want to set the view's frame, e.g. 
     // [self.someViewController.view setFrame:...]; 
     [self.window.contentView addSubview:self.someViewController.view]; 
    } 
} 
+1

是絕對輝煌! Thnx –

+0

如何創建報關單?與nswindowcontroller – jkk

+0

優秀!謝謝你的解釋! – nonamelive