检测导航控制器何时弹出到root

时间:2010-03-13 06:04:53

标签: iphone

这是我的代码:

SignupController* signupController = [[SignupController alloc] initWithNibName:@"SignupController" bundle:nil];
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];

    self.navigationController.title = @"MyNavController";

    [self.navigationController pushViewController:signupController animated:YES];
    [signupController release];

不幸的是,我调用pushViewController不是同步的,所以下一行([signupController release])会立即执行。

我需要检测到signupController已经弹出回root,这样我就可以从注册控制器获取数据并进行注册或登录。

有什么想法吗?

由于

4 个答案:

答案 0 :(得分:4)

使用委托模式回调主控制器,让它知道注册控制器即将退出。在导航控制器释放之前,复制注册控制器中的值。

// SignupController.h
@protocol SignupDelegate;
@interface SignupController : UIViewController {
    id <SignupDelegate> delegate;
    NSString *name;
}
@property (nonatomic, assign) id <SignupDelegate> delegate;
@property (nonatomic, retain) NSString *name;
@end
@protocol SignupDelegate
- (void) signupControllerDidFinish:(SignupController *)controller;
@end

// SignupController.m
@implementation SignupController
@synthesize delegate;
@synthesize name;

- (void) viewWillDisappear:(BOOL)animated {
    [self.delegate signupControllerDidFinish:self];
}
@end

// YourViewController.m
- (void) signupSelected {
    SignupController *signup = [[SignupController alloc] initWithNibName:NSStringFromClass([SignupController class]) bundle:nil];
    signup.delegate = self;
    [controller.navigationController pushViewController:signup animated:YES];
    [signup release];
}

- (void) signupControllerDidFinish:(SignupController *)signup {
    NSLog(@"Signup with name %@", signup.name);
}

答案 1 :(得分:2)

在SignupController中的-viewWillDisappear:中实现注册。但是如果登录失败,你无法阻止控制器消失。

您可能希望将SignupController呈现为模型视图控制器,而“后退”按钮不再自动显示,因此您可以控制何时离开该页面。

答案 2 :(得分:1)

有几种方法可以做到这一点:

  1. 授予UINavigationController代理人,并让代理人回复navigationController:willShowViewController:animated:。在该方法中,检查并查看即将显示的视图控制器是否是导航控制器的viewControllers数组中的第一个视图控制器。这样做的缺点是无法区分popToRoot和简单的后退行为。
  2. 子类UINavigationController并覆盖popToRoot方法:

    - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
      //somehow notify (NSNotification, delegate, etc) that you're popping to root
      return [super popToRootViewControllerAnimated:animated];
    }
  3. 在根视图的控制器中实现viewWillAppear方法。这样做的缺点是无法区分初始推送,popToRoot和简单的后退动作。

答案 3 :(得分:0)

不确定我是否理解你的问题......

但如果我这样做......为什么不使用BOOL isSigningUp。

在您的根目录上,在ViewDidLoad上,您将其指定为NO。

当您按下signupController时,将BOOL指定为YES。

然后,在你的root的viewWillAppear上,你放了......

if (isSigningUp == YES) {
  isSigningUp = NO;
  //do registration or login
}

这很容易,这意味着我可能不明白你的要求。如果是这样的话,抱歉花时间。

一切顺利。