2016-08-25 6 views
2

私はUOSボタンを持っていますが、iOS 9.3では表示されません。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)); 

} 
+1

プロパティを「弱」から「強」に変更します。違いは? – rmaddy

+0

それは恥ずかしいです。どのように私はそれをキャッチしていないか分からない。これで問題は解決します。しかし、なぜそれが8ではなく9で動作するのですか? –

+0

私は常にIBOutletsには弱く、コードで作成されたすべてのUIElementsには強くなります。 –

答えて

5

iOS 8と9のメモリ管理に違いがあるようです。あなたの財産は弱いです。 [self.view addSubview:self.btnSettings];への呼び出しでサブビューとしてボタンを追加するまで、強い参照は得られません。

iOS 9では、その呼び出しに達する前に弱参照が割り当て解除され(プロパティがnilに設定されている)ように見えます。しかし、iOS 8の下では、弱いプロパティは、その行が解放されるのを防ぐのに十分長い間、スティックされます。

簡単な解決策は、weakの代わりにstrongというプロパティを作成することです。

もう1つのオプション(Jefに感謝)は、weakのプロパティを維持し、viewDidAppearメソッドではローカル変数を使用することです。次に、ローカル変数をサブビューとして追加した後に、ローカル変数をプロパティに割り当てます。

あなたのコードには他に関連しない問題が1つあります。このビューコントローラに他のビューコントローラが表示されている場合は、viewDidAppear:メソッドが複数回呼び出され、複数のボタンが追加されます。このコードをviewDidLoad(実際にはどこに属しているか)に移動するか、viewDidAppearのコードがView Controllerの有効期間中に1回だけ呼び出されるようにします。

+0

私は正直に同意しません。あなたはなぜそれが失われるのか正確には正しいですが、私はより良い解決策は、より一時的な強力なポインタを使用することだと思う - UIButton * aButton = ......; ...... //ボタンの設定。 [self.view addSubview:aButton]; //ボタンはビュー階層の一部として保持されるようになりました。self.settingsButton = aButton – Jef

+1

@Jefこれは不一致ではなく、プロパティを「強くする」ための完全に良い代替手段です。 – rmaddy

+0

私はそれが大きい写真のデザイン、メモリ管理などに与える影響がより少ないので、そう言います。 – Jef

関連する問題