19

我正在开发一个 iPhone 应用程序,并且在我的控制器中获得对 IBOutlet 字段的(空)引用。我有一个 UIViewController 子类,它在我的 XIB 中设置为文件的所有者。我有一组连接到控制器的 UI 元素。从 NIB 加载并尝试在这些 UI 元素上设置属性后,我发现它们是 (null)。为了澄清,一些代码:

ExpandSearchPageController.h:

@interface ExpandSearchPageController : UIViewController
{
  IBOutlet UITextView * completeMessageView;
}

-(void)checkTextField;

@property (nonatomic, retain) IBOutlet UITextView * completeMessageView;

展开搜索页面控制器.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)"
4

5 回答 5

49

我想在看了一个多小时后问这个问题让我想通了:

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

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

于 2009-08-11T01:16:09.323 回答
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;

然后我们设置UILabel上的text属性,在secondViewController.m的viewDidLoad中。到此阶段,IBOutlet 已创建并准备就绪。

- (void)viewDidLoad {
   [super viewDidLoad];
   self.label.text = self.stringForLabel;
}
于 2015-01-07T05:34:44.093 回答
3

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

于 2010-04-24T10:33:34.543 回答
0

确保视图控制器的视图属性(即本例中的文件所有者)连接到 xib 中的视图。由于您的 textField 几乎可以肯定是它的子视图,因此将其连接起来也很重要(而且我认为如果没有设置,笔尖将无法正确加载)。

于 2009-08-11T01:14:02.917 回答
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];
}
于 2016-06-13T10:14:53.840 回答