我有一个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) );
}
答案 0 :(得分:5)
iOS 8和9之间的内存管理似乎有所不同。您的属性很弱。在您通过调用[self.view addSubview:self.btnSettings];
将该按钮添加为子视图之前,它不会获得强大的参考。
似乎在iOS 9下,弱访问在达到该调用之前被释放(并且属性设置为nil
)。但是在iOS 8下,弱的属性会持续足够长的时间才能达到该行,从而防止它被解除分配。
简单的解决方案是使属性strong
而不是weak
。
另一个选项(感谢Jef)是保留属性weak
,但在viewDidAppear
方法中使用局部变量。然后在将局部变量添加为子视图后将局部变量分配给属性。
您的代码中另一个不相关的问题。如果此视图控制器显示其他视图控制器,则viewDidAppear:
方法将被多次调用,您将最终添加多个按钮。将此代码移动到viewDidLoad
(它确实属于任何地方),或者确保viewDidAppear
中的代码仅在视图控制器的生命周期内被调用一次。