1

そのメソッドには がありrootViewControllerviewDidLoad別の 2 つのViewController2*オブジェクトとそのビューを のサブビューとして初期化しrootViewController.view、最初に を設定しViewController2* controller.view.hidden = YESました。

次に、v1にはボタンハンドラーがあり、タッチするとUINavigationControllerが表示され、その後dismissViewControllerAnimatedv1で「閉じる」ボタンが呼び出されます。

問題は、解雇が完了すると、ViewController2*火の 2 つですviewWillAppear。表示されているものだけを起動viewWillAppearし、非表示のものでは起動しないようにする方法は?

rootViewController実装:

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.v1 = [[ViewController2 alloc] init];
self.v1.title = @"v1";
[self.view addSubview:self.v1.view];
self.v1.view.hidden = YES;

self.v2 = [[ViewController2 alloc] init];
self.v2.title = @"v2";
[self.view addSubview:self.v2.view];

UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"POP" forState:UIControlStateNormal];
[btn sizeToFit];
[btn addTarget:self action:@selector(touchHandler:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:btn];
}

- (void)touchHandler:(id)sender {
UINavigationController * nc= [[UINavigationController alloc] initWithRootViewController:[[UIViewController alloc] initWithNibName:nil bundle:nil]];

((UIViewController *)[nc.viewControllers objectAtIndex:0]).navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"dismiss" style:UIBarButtonItemStyleBordered target:self action:@selector(dismissHandler:)];

[self presentViewController:nc animated:YES completion:nil];
}

- (void) dismissHandler:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
}
@end

ViewController2:

@implementation ViewController2
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"%@",self.title);
}

@end
4

2 に答える 2

0

ビュー コントローラ ビューが hidden=YES に設定されていても、viewWillAppear は UIViewController で起動します。

高価な操作が発生するのを防ぎたい場合は、viewWillAppear デリゲート メソッドで if (self.view.hidden == YES) を確実にテストできますが、後でそのビューを非表示にしない場合、その viewWillAppear は起動しないことに注意してください。それから。

于 2012-10-25T18:03:54.147 に答える
0

簡単に言えば、これらのメソッドが呼び出される理由は、viewController のビューがメイン ウィンドウのビュー階層の一部であるためです。これは、そのスーパービューがメインウィンドウになるまで、スーパービューを持つスーパービューを持つスーパービューを持つことを意味します。viewController ビューを隠したり隠したりする代わりに、スーパービューに追加したり削除したりする必要があります。また、viewWillAppear と viewDidAppear が正しいタイミングで正しく呼び出されるようにするには、ViewController Containment を参照してください: http://www.cocoanetics.com/2012/04/containing-viewcontrollers/

于 2012-10-26T11:25:41.150 に答える