从NIB加载后,IBOutlet实例为(null)

时间:2009-08-11 01:09:38

标签: ios objective-c null iboutlet retain

我正在开发一个iPhone应用程序,并且在控制器中获取(null)对IBOutlet字段的引用。我有一个UIViewController子类,在我的XIB中设置为File的所有者。我有一组连接到控制器的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)"

5 个答案:

答案 0 :(得分:49)

我想在查看问题超过一个小时后问这个问题让我弄清楚了:

我刚刚更改了我的代码,以便在显示视图后检查文本框...现在所有内容都已实例化。

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

答案 1 :(得分:4)

这是解决方案。

在视图控制器完成加载之前,IBOutlets还没有准备好使用。

例如,如果要设置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;

然后我们在第二个ViewController.m的viewDidLoad中的UILabel上设置text属性。 到目前为止,IBOutlet已经创建并准备好了。

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

答案 2 :(得分:3)

null IBOutlet指针的另一个潜在原因是在创建插座连接后忘记在Interface Builder中保存xib文件。

答案 3 :(得分:0)

确保视图控制器的视图属性(即本例中的文件所有者)连接到xib中的视图。由于你的textField几乎可以肯定是一个子视图,所以连接也很重要(我不认为nib会在没有设置的情况下正确加载)。

答案 4 :(得分:0)

我就是这样做的:

//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];
}