在从NIB加载之后,IBOutlet实例是(null)

我正在研究一个iPhone应用程序,并获取(null)引用到我的控制器中的IBOutlet字段。 我有一个UIViewController子类被设置为我的XIB文件的所有者。 我有一组连接到控制器的UI元素。 从NIB加载并尝试设置这些UI元素的属性后,我发现它们是(null)。 为了澄清一些代码:

ExpandSearchPageController.h:

@interface ExpandSearchPageController : UIViewController { IBOutlet UITextView * completeMessageView; } -(void)checkTextField; @property (nonatomic, retain) IBOutlet UITextView * completeMessageView; 

ExpandSearchPageController.m:

 @implementation ExpandSearchPageController @synthesize completeMessageView; -(void)checkTextField { NSLog(@"text field: %@",completeMessageView); } 

ExpandSearchPageController被设置为ExpandSearchPage.xib的文件所有者。 ExpandSearchPage.xib的UITextView连线到completeMessageView。

当我打电话

 ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]]; [searchExpanderPage checkTextField]; 

结果是

 "text field: (null)" 

我想问问题一个多小时后问题导致我弄明白了:

我只是改变了我的代码来检查显示视图后的文本框…现在一切都被实例化。

想象一下:在显示UI元素之前,UI元素不会被实例化!

这是解决scheme。

视图控制器完成加载之前,IBOutlet尚未准备好使用。

例如,如果要设置UILabels文本属性,则需要先在控制器上设置NSString,然后将标签文本属性设置为viewDidLoad之类的位置。

所以在你的firstViewController.m :(这是故事板,但同样的想法适用)

 - (void)buttonPress:(id)sender { [self performSegueWithIdentifier:@"mySegue" sender:self]; } - (void)prepareForSegue(UIStoryboardSegue *)segue sender:(id)sender { SecondViewController *secondViewController = [segue destinationViewController]; secondViewController.stringForLabel = @"My Label String"; } 

然后在你的secondViewController的.h中:

 @property (strong, nonatomic) IBOutlet UILabel *label; @property (strong, nonatomic) NSString *stringForLabel; 

然后我们在secondViewController.m的viewDidLoad中设置UILabel的text属性。 在这个阶段,IBOutlet已经创build并准备好了。

 - (void)viewDidLoad { [super viewDidLoad]; self.label.text = self.stringForLabel; } 

导致无IBOutlet指针的另一个潜在原因是在创build出口连接后忘记在Interface Builder中保存xib文件。

确保你的视图控制器的视图属性(即在这种情况下文件的所有者)被连线到xib中的视图。 由于你的textField几乎肯定是这个子视图,所以重要的是也要连接它(并且我不认为如果没有被设置,那么笔尖将会正确加载)。

这是我如何做到的:

 //in your view controller -(void)setUp { [self.cardView layoutIfNeeded]; LearnCardPlainText *cardNib = [[[UINib nibWithNibName:@"LearnCardPlainText" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0]; cardNib.frame = self.cardView.frame; [cardNib setUpWithPart:learnModel]; [self.view addSubview:cardNib]; }