UIButton不会在iOS 9.3上显示

use*_*651 2 iphone objective-c uibutton ios

我有一个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) );

}
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 5

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

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

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

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

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