対応する .xib ファイルを持つ単純な UIViewController があります。
ViewController *v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:v animated:YES];
この .xib ファイルには、画面の中央に配置された UILabel があります。ビューがロードされたら、このラベルを新しい位置に移動したいと思いますが、表示される前に:
label.center = CGPointMake(0,0);
上記のコードを次のメソッドに入れようとすると、次のようになります。
initWithNibName:bundle
: 位置は更新されませんawakeFromNib
: 位置は更新されませんviewDidLoad
: 位置は更新されませんviewWillAppear
: 位置は更新されませんviewDidAppear
: 位置は、ビューが完全にロードされた後にのみ更新されます (つまり、ラベルの元の位置が一瞬表示されます)。
text プロパティのようなものを更新しようとすると:
label.text = @"Foo";
...これらすべての方法で機能します。何らかの理由で、.xib ファイルによって上書きされるのはその位置だけです。
「位置が更新されない」と言うときは、ラベルが画面に表示されたときに、上書きしようとしている場所ではなく、.xib ファイルで定義された場所にあることを意味します。
位置を変更しようとするとNSLog
、正しく更新されていることが示されますが、 で再度位置を確認するとviewDidAppear
、正しくない値が表示されます。たとえば、.xib が x を 99 で定義していて、それを 0 に変更したいとします。
- (void)viewWillAppear:(BOOL)animated {
label.center = CGPointMake(0,0);
NSLog(@"%f", label.center.x); // reports 0
}
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%f", label.center.x); // reports 99 (Error: should be 0)
label.center = resultLabelHiddenCenter;
NSLog(@"%f", label.center.x); // reports 0
}
ビューが表示される前に、視覚的な不具合なしにラベルの中心を更新するにはどうすればよいですか?