在从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]; }