我正在开发一个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)"
答案 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];
}