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 在 UIWindow 的子视图上不起作用

界面生成器 UIButton 自定义背景图像在模拟器/设备上不起作用

由 UITapGestureRecognizer 创建的单击在 UIButton 上不起作用

使用 UIModalTransitionStyleCrossDissolve 进行转换在 IOS Sdk 9.3 中显示 iphone6s 错误

UiButton 点击​​在 UIView 上不起作用