UIButton 在 iOS 9.3 上不显示
Posted
技术标签:
【中文标题】UIButton 在 iOS 9.3 上不显示【英文标题】:UIButton does not show on iOS 9.3 【发布时间】:2016-08-25 20:42:57 【问题描述】:我有一个不只出现在 ios 9.3 中的 UIButton。
我不明白为什么。谁能告诉我我做错了什么?
我需要 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) );
【问题讨论】:
将属性从weak
更改为strong
。有什么区别吗?
这很尴尬。我不知道我怎么没抓住它。这解决了这个问题。但为什么它在 8 中有效,但在 9 中无效?
我总是对 IBOutlets 很弱,对所有由代码创建的 UIElements 都很强。
【参考方案1】:
iOS 8 和 9 之间的内存管理似乎有所不同。您的属性很弱。在您将按钮添加为子视图并调用[self.view addSubview:self.btnSettings];
之前,它不会得到强引用。
似乎在 iOS 9 下,弱引用在调用之前被释放(并且属性设置为nil
)。但在 iOS 8 下,weak 属性会持续存在足够长的时间,以防止该行被释放。
简单的解决方案是使属性strong
而不是weak
。
另一个选择(感谢 Jef)是保留属性 weak
,但在 viewDidAppear
方法中使用局部变量。然后将局部变量添加为子视图后将局部变量赋值给属性。
另一个与您的代码无关的问题。如果此视图控制器显示其他视图控制器,则 viewDidAppear:
方法将被多次调用,您最终将添加多个按钮。要么将此代码移动到viewDidLoad
(无论如何它确实属于那里),要么确保viewDidAppear
中的代码在视图控制器的生命周期内只被调用一次。
【讨论】:
我不同意。你完全正确为什么它会丢失,但我认为更好的解决方案是使用更临时的强指针 - UIButton *aButton = ......; ......//按钮配置; [self.view addSubview: aButton] ;//按钮现在保留为视图层次结构的一部分.. self.settingsButton = aButton @Jef 这不是意见分歧,这是创建属性strong
的完美替代方案。
我之所以这么说是因为它对大图设计、内存管理等影响较小。最好:)以上是关于UIButton 在 iOS 9.3 上不显示的主要内容,如果未能解决你的问题,请参考以下文章
WKWebView 视口缩小以适应在 iOS 9.3 上不起作用
界面生成器 UIButton 自定义背景图像在模拟器/设备上不起作用
由 UITapGestureRecognizer 创建的单击在 UIButton 上不起作用
使用 UIModalTransitionStyleCrossDissolve 进行转换在 IOS Sdk 9.3 中显示 iphone6s 错误