Экземпляры IBOutlet (null) после загрузки из NIB
Я работаю над iPhone-приложением и получаю (нулевые) ссылки на поля IBOutlet в моем контроллере. У меня есть подкласс UIViewController, который установлен в качестве владельца файла в моем XIB. У меня есть набор элементов интерфейса, которые подключены к контроллеру. После загрузки из NIB и попыток установить свойства для этих элементов пользовательского интерфейса я обнаружил, что они (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)"
Ответы
Ответ 1
Я думаю, задавая вопрос, посмотрев на проблему более часа, заставил меня понять:
Я только что изменил свой код, чтобы проверить текстовое поле ПОСЛЕ отображения отображения... теперь все создается.
Представьте, что: элементы пользовательского интерфейса не создаются, пока вы их не отобразите!
Ответ 2
Это решение.
IBOutlets не готовы к использованию, пока контроллер просмотра не завершит загрузку.
Например, если вы хотите установить свойство текста UILabels, вам нужно сначала установить NSString на вашем контроллере, а затем установить свойство text меток где-то вроде 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 вашего secondViewController:
@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
Другая потенциальная причина нулевого указателя IBOutlet - это забыть сохранить файл xib в Interface Builder после создания выходного соединения.
Ответ 4
Убедитесь, что свойство view вашего контроллера вида (т.е. владелец файла в этом случае) подключено к представлению в вашем xib. Поскольку ваш textField почти наверняка является подходом к этому, важно также подключиться к этому проводнику (и я не думаю, что nib будет загружаться правильно, не будучи установленным).
Ответ 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];
}