2013-10-31 50 views
4

我有一個MyCustomView子類從NSView在.xib中設計。界面生成器:如何從nib文件加載視圖

我想插入這個視圖到我的應用程序的一些其他xib中。我應該怎麼做?如果我拖動自定義視圖並將類更改爲MyCustomView,但不會加載我的xib文件。這隻能以編程方式完成,還是有一種方法可以在界面構建器中執行此操作?

EDIT1:

這裏是一個非常小的演示項目: http://s000.tinyupload.com/index.php?file_id=09538344018446482999

它包含默認MainMenu的廈門國際銀行和我的CustomView廈門國際銀行。我希望我的CustomView.xib顯示在添加到我的MainMenu.xib的自定義視圖中 - 使用盡可能少的代碼。

回答

5

對於加載您需要在窗口上添加視圖: - 創建自定義類的觀點繼承到NSViewController

#import <Cocoa/Cocoa.h> 

@interface NewViewController : NSViewController 

@end 

#import "NewViewController.h" 

@implementation NewViewController 

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

    return self; 
} 

@end 

您的廈門國際銀行的名字是yourview.xib

- (void)windowDidLoad { 
    NSViewController *yourVC = [[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil]; 
    [[[self window] contentView] addSubview:[yourVC view]]; 
} 
+0

所以我需要以編程方式初始化視圖/控制器並將其添加到主視圖中的自定義視圖?之後,我還需要在兩個視圖之間以編程方式添加約束。 – dhrm

+0

是的,首先你需要用xib創建自定義類繼承NSViewController,然後你可以像上面寫的那樣在代碼中加載相同的xib。此外,爲了您的參考,我更新了代碼 –

0

聽起來像是你需要一個容器視圖。但是我認爲你必須使用storyboard才能在界面構建器中實現。

+0

它不適用於iOS,故故事板不是一種選擇? – dhrm

+0

好的,對不起,我的不好。僅針對iOS開發 – ullstrm

-1

我建議只是做編程:

  1. 視圖添加到您的主xib/storyboard和自定義類設置爲自定義視圖的類
  2. 在你的廈門國際銀行的自定義視圖,設置文件的所有者類自定義視圖的類需要
  3. 做一個__strong屬性/伊娃用於保存參考廈門國際銀行的高層NSView
  4. 掛鉤的任何IBOutlets
  5. 在自定義視圖的類實現initFromFrame大致如下:
 
@interface CustomView() 
{ 
    __strong NSView *nibView; 
} 
@end 

@implementation CustomView 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     NSArray *nibObjects; 
     [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self topLevelObjects:&nibObjects]; 
     nibView = nibObjects[1]; 
     [self addSubview:nibView]; 
    } 
    return self; 
} 

IBOutlet是在loadNibNamed呼叫後,立即連接起來,這樣你就可以從那裏做進一步的初始化。

另一種選擇是做的事情純屬編程: 1.在您的自定義xib,根視圖的類設置爲自定義類 2.在您的自定義類實現awakeFromNib對您的自定義執行初始化 3.通話loadNibNamed:xib並以編程方式將其添加到沒有界面構建器的用戶界面。

+0

關於爲什麼您使用'nibObjects [1]'而不是'nibObjects [0]'的任何說明? – JamEngulfer

+0

嘗試此操作時,我只是得到一個編碼器錯誤:致命錯誤:init(編碼器:)尚未實現: –

0

使用視圖控制器,因爲它會處理你的筆尖加載,並提供一個地方掛鉤IBOutletIBActions在一個可重用的方式。

在您的應用程序委託或任何控制器中創建視圖控制器的實例。 請求您的視圖控制器加載其視圖。 將返回類型轉換爲您的視圖類名稱。 然後保持對視圖控制器和視圖的引用。

告訴任何視圖將視圖添加爲子視圖。 添加任何佈局約束。 (你可以打造出非常通用的限制通過重寫viewDidMoveToSuperviewviewDidMoveToWindowsuperview或窗口不無添加自己在您的視圖或視圖控制器,使用同一刪除您的約束。)

奇怪的是你通過刪除視圖告訴它從superview中刪除自己。

+0

如何將視圖控制器鏈接到Xib文件? –

+0

沒有真正的聯繫。您將nib/xib文件的名稱作爲字符串傳遞給initWithNibName:bundle:並始終使用NSBundle bundleForClass:來傳遞該包。這使它可以重用,並且不像NSBundle mainBundle那樣耦合到應用程序包。 nil for bundle與NSBundle mainBundle相同。您的nib/xib應該將文件的所有者類設置爲NSViewController或一個子類。子類使IB能夠識別自定義IBOutlet!但你總是可以用代碼把事情搞定並投入事情,有時你應該這樣做。 – uchuugaka

相關問題