iPhone - Невозможно получить доступ к IBOutlet (оценивается как ноль) - PullRequest
3 голосов
/ 15 января 2011

У меня проблема с доступом к IBOutlet.

У меня есть NIB, внутри которого есть табличное представление, панель инструментов и UILabel (инкапсулированные в представление). Контроллер (то есть владелец файла) определяется как:

@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> { 
 IBOutlet UILabel* __periodeInitialeLabel;
}

@property(nonatomic, retain) UILabel* periodeInitialeLabel;

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;

с @synthetize periodeInitialeLabel = __periodeInitialeLabel;

В файле .m эта функция вызывается родительским окном для инициализации метки:

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode {
 NSMutableString* tmpString = [NSMutableString string];

 [tmpString appendFormat:some text format....];

 self.periodeInitialeLabel.text = tmpString;
}

В этой функции я вижу, что self.periodeInitialeLabel имеет нулевое значение. Я не понимаю почему. Все связано в ИБ ... Видите, в чем может быть проблема?

Ответы [ 4 ]

5 голосов
/ 16 января 2011

Вопрос здесь - порядок операций.Если текстовая метка все еще равна нулю, скорее всего, она еще не настроена.Вместо этого вы можете вызвать этот метод внутри метода UIViewController viewDidLoad для обработки таких операций, которые должны выполнять «дополнительную настройку», которую невозможно выполнить в Интерфейсном Разработчике.

Существует также awakeFromNib.Они очень похожи, за исключением того, что awakeFromNib называется ONCE , когда файл NIB не распакован.viewDidLoad можно вызывать много раз - например, если ситуация с нехваткой памяти (часто случается на iOS4), ваши просмотры будут удалены через viewDidUnload.

4 голосов
/ 25 февраля 2012

Для тех, у кого все еще есть проблемы с этим, я сталкивался с чем-то похожим даже в примере приложения. Ответ оказался таким:

UIImageView Создано в Интерфейсном Разработчике, установленное в ноль при необходимости

[self memberVar]

Загружает объект, пока:

self.memberVar

Просто получает доступ к текущему значению, которое останется нулевым. Поэтому я пытаюсь уйти от использования "." оператор. Это очень тонкая проблема, которую я видел в последнее время во многих примерах кода. Метод подчеркивания в новых примерах:

@synthesize memberVar = _memberVar;

по-прежнему просто оставляет переменную-член nil, пока вы не получите к ней доступ с помощью [self memberVar]. Я думаю, что Apple, возможно, пытается избежать этой проблемы, ссылаясь на _memberVar в реализации (например, в dealloc с [_imageView release])


ОБНОВЛЕНИЕ: Кроме того, если вы используете initWithNibName или loadNibNamed для загрузки контроллера с перо или сгиб на лету (например, пользовательский UITableViewCell), не забудьте позвонить:

[self loadView];

Это также загружает переменные-члены. Они не загружаются автоматически, если только вид не отображается или не pushViewController на navigationController.

0 голосов
/ 15 января 2011

Учитывая этот интерфейс:

@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> {    
    UILabel* __periodeInitialeLabel;
}

// I think it's more appropriate to mark a property with IBOutlet,
// rather than an ivar
@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel;

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;

// ...

@end

его реализация должна выглядеть так:

@implementation ChoixPeriodeController

@synthesize
periodeInitialeLabel = __periodeInitialeLabel;

// the rest of your implementation goes here
// ...

@end

Я бы также предложил вам ознакомиться с Руководством по стилю Google Objective-C . Называть ваши ивары двумя ведущими символами подчеркивания, возможно, не лучший выбор.

0 голосов
/ 15 января 2011

Я думаю, что ваша собственность должна быть определена также с IBOutlet, например:

@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel; 

и вам необходимо @synthesize свойство в файле реализации, а затем убедиться, что periodeInitialeLabel правильно подключено в IB (т.е. не `__periodeInitialeLabel ');

Обновление:

Если ваш оператор синтеза выглядит так:

@synthesize periodeInitialeLabel;

тогда это, вероятно, ваша проблема. Я думаю, что это должно быть так:

@synthesize periodeInitialeLabel = __periodeInitialeLabel;

чтобы подключить его к вашему полю.

...