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