检测导航控制器何时弹出到根视图

4

这是我的代码:

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何时弹回到根视图,这样我就可以从signup控制器获取数据并进行注册或登录。

有什么想法吗?

谢谢

4个回答

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);
}

2
在您的注册控制器中,在-viewWillDisappear:方法中实现注册。但是,如果登录失败,您无法阻止控制器消失。
您可能希望将SignupController呈现为模态视图控制器,其中“返回”按钮不再自动显示,这样您就可以控制何时离开该页面。

1

你可以通过以下几种方式实现:

  1. UINavigationController 设置一个代理,并让代理响应 navigationController:willShowViewController:animated: 方法。在该方法中,检查即将显示的视图控制器是否是导航控制器的 viewControllers 数组中的第一个视图控制器。这种方法的缺点是无法区分 popToRoot 和简单的返回操作。
  2. 子类化 UINavigationController 并重写 popToRoot 方法:

    - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
      //以某种方式通知(NSNotification、delegate等)你正在弹出到根视图
      return [super popToRootViewControllerAnimated:animated];
    }
  3. 在根视图的控制器中实现 viewWillAppear 方法。这种方法的缺点是无法区分初始推送、popToRoot 和简单的返回操作。


我非常喜欢#2的想法(尽管在Cocoa中尽可能避免子类化,当然)。在我的情况下,我将Table View Controllers推入堆栈,而不是一般的VCs。我当然可以子类化UITableViewController,但在这种情况下它不会响应popToRootViewControllerAnimated:。此外,我需要区分各种操作(您列表中的#1和#3)。嗯,该怎么办。:\ - Joe D'Andrea

0

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

但如果我理解了...为什么不使用一个BOOL类型的isSigningUp。

在你的根视图上,在ViewDidLoad方法中,将其赋值为NO。

当你推出注册控制器时,将你的BOOL类型变量赋值为YES。

然后,在你的根视图的viewWillAppear方法中,加入以下代码...

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

这很简单,这意味着我可能没有理解你的问题。如果是这种情况,抱歉浪费了您的时间。

祝一切顺利。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接