2016-08-25 3 views
2

У меня есть UIButton, который не отображается только в iOS 9.3.UIButton не отображается на iOS 9.3

Я не понимаю, почему. Может ли кто-нибудь сказать мне, что я сделал неправильно?

Мне нужна кнопка в методе ViewDidAppear, так как у меня есть другие элементы макета, которые нужно поместить после установки этой кнопки.

iPhone 6 8,1 Кнопка Настройки Расположение: {{100, 100}, {42, 42}}

iPhone 6 9.3 Кнопка Настройки Расположение: {{0, 0}, {0, 0}}

iPhone 6Plus Настройки 8.1 Кнопка Расположение: {{100, 100}, {42, 42}}

iPhone 6Plus 9,3 Кнопка Настройки Расположение: {{0, 0}, {0, 0}}

#define MARGIN_SIZE 10 
@interface HomeViewController() 
@property (weak, nonatomic) UIButton *btnSettings; 
@end 


- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    self.btnSettings = [UIButton buttonWithType:UIButtonTypeCustom]; 
    self.btnSettings.userInteractionEnabled = YES; 
    self.btnSettings.frame = CGRectMake(100, 100, 42, 42); 
    self.btnSettings.tag = 21; 
    [self.btnSettings setImage:[UIImage imageNamed:@"settings_black"] forState:UIControlStateNormal]; 
    [self.btnSettings addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:self.btnSettings]; 

    NSLog(@"Button Settings Location: %@", NSStringFromCGRect(self.btnSettings.frame)); 

} 
+1

Измените свойство от 'слабого' до' сильного'. Любая разница? – rmaddy

+0

Ну, это неловко. Я не знаю, как я этого не поймал. Это устраняет проблему. Но почему он работал в 8, а не 9? –

+0

Я всегда слаб для IBOutlets и прочен для всех UIElements, созданных кодом. –

ответ

5

Существует разница в управлении памятью между iOS 8 и 9. Ваше свойство слабое. Он не получает сильную ссылку, пока вы не добавите кнопку в качестве подзона с вызовом [self.view addSubview:self.btnSettings];.

Похоже, что при iOS 9 слабая ссылка освобождается (и свойство установлено в nil) до того, как этот вызов будет достигнут. Но под iOS 8 слабое свойство прилипает достаточно долго, чтобы эта линия была достигнута, чтобы предотвратить ее освобождение.

Простое решение для создания объекта strong вместо weak.

Другой вариант (спасибо Jef) заключается в том, чтобы сохранить свойство weak, но использовать локальную переменную в вашем методе viewDidAppear. Затем назначьте локальную переменную свойству после добавления локальной переменной в качестве подсмотра.

Еще одна несвязанная проблема с вашим кодом. Если в этом контроллере представления отображаются другие контроллеры представлений, то метод viewDidAppear: будет вызываться более одного раза, и вы добавите несколько кнопок. Либо переместите этот код в viewDidLoad (где это действительно так или иначе), либо убедитесь, что код в viewDidAppear называется только один раз для жизни контроллера вида.

+0

Я почтительно не согласен. Вы точно знаете, почему это заблудилось, но я думаю, что лучшим решением будет использование более временного сильного указателя - UIButton * aButton = ......; ...... // кнопка config; [self.view addSubview: aButton]; // кнопка теперь сохраняется как часть иерархии представлений .. self.settingsButton = aButton – Jef

+1

@Jef Это не несогласие, это отличная альтернатива созданию свойства 'strong'. – rmaddy

+0

Я только так говорю, потому что он имеет меньшее влияние на дизайн большой картины, управление памятью и т. Д. Лучше :) – Jef

Смежные вопросы