2012-08-29 71 views
0

我試圖使用NameSubViewNameSubViewController作爲MainViewController中的子視圖。我做了工作,但我也想訪問的子視圖的UITextField,像這樣:使用XIB的視圖作爲子視圖並訪問其文本屬性

MainViewController.m

#import "NameSubViewController.h" 

... 

UIViewController *nameController = [[NameSubViewController alloc] initWithNibName:@"NameSubViewController" bundle:nil]; 
nameSubView = [nameController view]; 
[self.view addSubview:nameSubView]; 

NSString *textFieldString = nameSubView.textField.text; 

但我無法使它工作。這就是我所做創建子視圖:

  • 製造NameSubViewController類XIB的接口

  • 製造NameSubView類的IB視圖,視圖設置爲該類身份督察

  • 創建@property (nonatomic, strong) IBOutlet UITextField *textField;NameSubView並連接到IB的文本字段。


然後我可以加載子視圖,但我不能從MainViewController訪問文本框。因此,要訪問它,我做了在Identity Inspector中將文件所有者的類NameSubViewController更改爲NameSubView

現在NameSubViewController被訪問,但沒有找到該視圖的屬性,所以該應用程序崩潰。我不知道我是否遵循正確的程序,現在可以在NameSubViewController中爲NameSubView創建一個屬性嗎?或者我應該遵循另一個程序?

回答

1
  • NameSubViewController返回給身份檢查器中的文件所有者。
  • NameSubView添加到身份檢查器中的視圖。

然後使用此代碼:

#import "NameSubViewController.h" 
// If view's declaration is located in a separate file then the next line is important 
#import "NameSubView.h" 

... 

// It is better to declare the view controller as 'NameSubViewController' 
NameSubViewController *nameController = [[NameSubViewController alloc] initWithNibName:@"NameSubViewController" bundle:nil]; 
// A casting to 'NameSubView' should do the main magic 
NameSubView *nameSubView = (NameSubView *)[nameController view]; 
[self.view addSubview:nameSubView]; 

// It is better to ensure that the view is of a correct class 
// before using its specific properties 
if ([nameSubView isKindOfClass:[NameSubView class]]) { 
    // Now it should work 
    // (assuming that you have a property 'textField' in 'NameSubView') 
    NSString *textFieldString = nameSubView.textField.text; 
} 
+0

得到textfield謝謝,像魔術一樣工作。從很多實驗和困惑中拯救了我。 – ingenspor

1

首先,改變文件的所有者回到NameSubViewController。將文本字段IBOutlet聲明移至NameSubViewController,並確保所有內容在nib中正確連接。最後,聲明nameController變量的類型爲NameSubViewController而不是UIViewController。你應該可以通過nameController.textField