UIButton不会在iOS 9.3上显示

时间:2016-08-25 20:42:58

标签: ios objective-c iphone uibutton

我有一个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 个答案:

答案 0 :(得分:5)

iOS 8和9之间的内存管理似乎有所不同。您的属性很弱。在您通过调用[self.view addSubview:self.btnSettings];将该按钮添加为子视图之前,它不会获得强大的参考。

似乎在iOS 9下,弱访问在达到该调用之前被释放(并且属性设置为nil)。但是在iOS 8下,弱的属性会持续足够长的时间才能达到该行,从而防止它被解除分配。

简单的解决方案是使属性strong而不是weak

另一个选项(感谢Jef)是保留属性weak,但在viewDidAppear方法中使用局部变量。然后在将局部变量添加为子视图后将局部变量分配给属性。

您的代码中另一个不相关的问题。如果此视图控制器显示其他视图控制器,则viewDidAppear:方法将被多次调用,您将最终添加多个按钮。将此代码移动到viewDidLoad(它确实属于任何地方),或者确保viewDidAppear中的代码仅在视图控制器的生命周期内被调用一次。