Экземпляры IBOutlet (нулевые) после загрузки из NIB - PullRequest
19 голосов
/ 11 августа 2009

Я работаю над приложением для iPhone и получаю (нулевые) ссылки на поля IBOutlet в моем контроллере. У меня есть подкласс UIViewController, который установлен в качестве владельца файла в моей XIB. У меня есть набор элементов пользовательского интерфейса, которые подключены к контроллеру. После загрузки из NIB и попытки установить свойства этих элементов пользовательского интерфейса, я обнаружил, что они (нулевые). Чтобы уточнить, какой-то код:

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. UITextView файла ExpandSearchPage.xib подключено к CompleteMessageView.

Когда я звоню

ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]];

[searchExpanderPage checkTextField];

результат

"text field: (null)"

Ответы [ 5 ]

49 голосов
/ 11 августа 2009

Я думаю, вопрос после того, как я более часа смотрел на проблему, заставил меня понять:

Я просто изменил свой код, чтобы проверить текстовое поле ПОСЛЕ отображения представления ... теперь все создается.

Представьте себе, что: элементы пользовательского интерфейса не создаются, пока вы их не отобразите!

4 голосов
/ 07 января 2015

Это решение.

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";
}

Тогда в .h вашего второго ViewController:

@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) NSString *stringForLabel;

Затем мы устанавливаем свойство text для UILabel в viewDidLoad secondViewController.m. На этом этапе IBOutlet был создан и готов к работе.

- (void)viewDidLoad {
   [super viewDidLoad];
   self.label.text = self.stringForLabel;
}
3 голосов
/ 24 апреля 2010

Другая потенциальная причина нулевого указателя IBOutlet - забыть сохранить xib-файл в Интерфейсном Разработчике после создания выходного соединения.

0 голосов
/ 13 июня 2016

Вот как я это делаю:

//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];
}
0 голосов
/ 11 августа 2009

Убедитесь, что свойство view вашего контроллера представления (т. Е. Владелец файла в этом случае) связано с представлением в вашей xib. Поскольку ваш textField почти наверняка является подвидом этого, важно также подключить его (и я не думаю, что перо будет загружаться должным образом без того, чтобы быть установленным).

...