这是我的代码:
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,这样我就可以从注册控制器获取数据并进行注册或登录。
有什么想法吗?
由于
答案 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)
有几种方法可以做到这一点:
UINavigationController
代理人,并让代理人回复navigationController:willShowViewController:animated:
。在该方法中,检查并查看即将显示的视图控制器是否是导航控制器的viewControllers
数组中的第一个视图控制器。这样做的缺点是无法区分popToRoot
和简单的后退行为。子类UINavigationController
并覆盖popToRoot
方法:
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated { //somehow notify (NSNotification, delegate, etc) that you're popping to root return [super popToRootViewControllerAnimated:animated]; }
在根视图的控制器中实现viewWillAppear
方法。这样做的缺点是无法区分初始推送,popToRoot
和简单的后退动作。
答案 3 :(得分:0)
不确定我是否理解你的问题......
但如果我这样做......为什么不使用BOOL isSigningUp。
在您的根目录上,在ViewDidLoad上,您将其指定为NO。
当您按下signupController时,将BOOL指定为YES。
然后,在你的root的viewWillAppear上,你放了......
if (isSigningUp == YES) {
isSigningUp = NO;
//do registration or login
}
这很容易,这意味着我可能不明白你的要求。如果是这样的话,抱歉花时间。
一切顺利。