2012-11-12 59 views
-1

因此,我有一個XIB文件,其中包含一個視圖。在這個視圖中,我想添加自定義對象,然後能夠獲取這些對象,並在視圖控制器中使用它們。我有我在其他地方創作的東西programmaticallyObjective-c - 從XIB文件獲取對象到視圖控制器中

我的XIB文件被稱爲"MyXibLibrary.xib" 我想要添加的對象被稱爲我的視圖控制器"ContactDetailsViewController"

我的視圖控制器正在從UITableViewController推這樣的:

ContactDetailsViewController *detailViewController = [[ContactDetailsViewController alloc] init]; 

而且在我的ContactDetailsViewController viewWillAppear裏面我有這段代碼來獲取XIB對象:

UIView *xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyLib" owner:self options:nil] objectAtIndex:0]; 
    [self.view addSubview:xibView]; 

現在,例如,loadNibNamed屬性應該是? XIB文件的名稱?該XIB文件中的視圖的名稱?或者是什麼?

這一切都給我帶來了錯誤和應用程序trows exeption。

我不知道如何處理XIB文件,因爲我超新到Objective-c編碼。

任何幫助將非常感謝! 謝謝!

回答

2

如果你看documentation for UIViewController,有一種方法稱爲initWithNibName:bundle:。它列出了Apple提供的五個不同的示例代碼項目,用於演示如何使用xib文件和視圖控制器。您應該閱讀其中的一些內容以獲得基本的瞭解。

2

如果你想從NIB加載UIView,這段代碼會更加正確(因爲你不知道xib文件中需要的對象的索引)。

- (id)loadViewFromNIB:(NSString *)nibName owner:(id)owner class:(Class)_class 
{ 
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil]; 

    for (id object in objects) { 
     if ([object isKindOfClass:_class]) { 
      return object; 
     } 
    } 
} 
-1

在界面構建器中打開MyLib.xib,檢查是否在該文件中實際上有一個UIView組件。

你從異常中得到什麼錯誤信息?

+0

這應該是一個評論 – Popeye

4

被稱爲NIB(作爲歷史事件)的XIB定義了將由視圖控制器「控制」的至少一個視圖。這個視圖可以表示整個用戶界面,或者只是其他視圖的子視圖(例如,您的XIB可以表示可重用的表格行)。因此,不應該以您描述的方式使用XIB作爲預構建界面元素的容器。

但是,只要您的控制器知道它們,使用XIB的組件就很簡單。也就是說,XIB的元素應該連接到視圖控制器類的屬性。

例如,假設您有以下視圖控制器接口:

#import <UIKit/UIKit.h> 

interface MyViewController : UIViewController { 
} 

@property (strong, nonatomic) IBOutlet UITextView *textEntry; 
@property (strong, nonatomic) IBOutlet UIButton *enterButton; 

相應的NIB將被命名爲MyView.xib。在界面生成器中,您可以將NIB的「文件所有者」設置爲「MyViewController」。然後,您可以將界面元素(UITextView和UIButton)鏈接到MyViewController的屬性(以您喜歡的任何方法 - 通常是一個選項+點擊&從界面元素拖動到文件所有者對象)。

完成此操作後,您可以隨意實例化視圖控制器,並使用該對象的屬性。例如,讓我們假設這個代碼是在名爲「SomeOtherController.m」文件:

- (void)aMethodOfSomeOtherController 
{ 
    MyViewController *myView = [[MyViewController alloc] 
           initWithNibName:@"MyViewController" 
           bundle:nibBundleOrNil]; 

    NSString *buttonLabelText = [[[myView] enterButton] titleLabel] text]; 
    NSLog(@"Button label text = %@", buttonLabelText); 

    [myView release]; 
} 

當調用該方法中,一個MyViewController實例將被創建,其將自動加載從筆尖和綁定存儲的對象他們到視圖控制器對象的屬性。然後它將檢索按鈕標籤的文本並將其寫入日誌控制檯。

+0

哇感謝這麼好的解釋,並花時間這樣做=) –

相關問題