IBOutlet中实例都(空)从NIB加载后
-
12-09-2019 - |
题
我工作的一个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)"
解决方案
我猜问这个问题,在这个问题寻找了一个多小时后,使我弄明白:
我只是改变了我的代码检查的文本框后显示的看法......现在一切都被实例化。
想象一下:直到你显示它们的UI元素不实例化
其他提示
这是该溶液中。
在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;
}
空IBOutlet中指针的另一个潜在的原因是忘记在界面生成的XIB文件保存在创建出口连接之后。
请确保您的视图控制器的视图属性(即文件在这种情况下,所有者)是有线到您的厦门国际银行的观点。当你的文本框是几乎可以肯定的是一个子视图,它来获取太那个有线(我不认为笔尖会正常加载不认为存在一套)是非常重要的。
这是我如何做到这一点:
//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];
}