IBOutlet中实例都(空)从NIB加载后(IBOutlet instances are (nul

2019-07-31 21:22发布

我工作的一个iPhone应用程序和我得到(空)到IBOutlet中的字段引用我的控制器。 我有一个设置为我的XIB文件的所有者一个UIViewController子类。 我有一组被布线到控制器UI元素。 从NIB加载并试图对这些UI元素设置的属性后,我发现,他们(空)。 为了澄清,一些代码:

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)"

Answer 1:

我猜问的问题找了一个多小时,使我弄明白之后的问题:

我只是改变了我的代码检查的文本框后显示的看法......现在一切都被实例化。

想象一下:你,直到它们显示的UI元素不会被实例!



Answer 2:

这是解决方案。

该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;

然后我们将设置的UILabel的文本属性,在secondViewController.m的viewDidLoad中。 通过这一阶段,IBOutlet中已经创建并准备去。

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


Answer 3:

一个空指针IBOutlet中的另一个潜在原因是忘记在Interface Builder的XIB文件保存在创建出口连接后。



Answer 4:

请确保您的视图控制器(即文件的所有者在这种情况下)的视图属性是有线到您的厦门国际银行的观点。 当你的文本框是几乎可以肯定的是一个子视图,重要的是要获得在有线太(我不认为笔尖会正常加载不认为存在套)。



Answer 5:

这就是我要做的事:

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


文章来源: IBOutlet instances are (null) after loading from NIB