如何popup一个viewController,然后通过委派推一个viewController

我有一个UITableViewController,当一个单元格被按下,我想控制器popup自己,然后让它popup的控制器,推另一个视图控制器到堆栈上。

我正在调用这个方法,因为popup的viewController是tableViewController的委托

我目前正在调用这个方法,否则,一切都搞砸了,等待animation结束。 这样做似乎有点不好意思,在我看来,如果某人的设备没有按照我给的分配的等待时间popup视图,就会失败。

以下是一些代码:

//**** code in my tableViewController ***// [self.navigationController popViewControllerAnimated:YES]; [self.delegate cellPressedInTableViewControllerWithCalculationsModel:(id)anArgmentMyDelegateMethodTakes]; // **** Code in the viewController being popped to ****// //CalculationsViewController is a subclass of UIViewController CalculationsViewController *calcViewController = [[CalculationsViewController alloc] init]; //some customization code would go her [self.navigationController performSelector:@selector(pushViewController:animated:) withObject:calcViewController afterDelay:0.75]; //this seems like the arbitrary part, the 0.75 second delay. [calcViewController release]; 

似乎应该有一个更好的方式来popup/推动通过委托,将在animation完成后执行。 等待时间似乎可能会导致意想不到的问题。

我也试过使用:

  performSelectorOnMainThread:withObject:waitUntilDone 

但代码只是立即执行,视图层次结构搞砸了。

我也看了这个问题: 代表团的问题已经让我走了这么远,但是我很好奇,看看是否有更好的方法来执行这样的任务,谢谢。

编辑:我也试过在NSInvocation的一个实例包装的方法,我不能让它协调方法调用,直到animation完成后没有任意设置延迟

你应该用旗帜来克服这种情况。 你在viewWillDisappear方法中设置了这个标志,这个方法被视图控制器popup。 当这个标志被设置,然后你可以推动堆栈上的另一个视图控制器。 希望很清楚。

做一个视图控制器的一个单一的推或popup的最简单的方法是设置UINavigationController的视图控制器数组。

例如,要popup并按下视图控制器:

 MyTableViewController *vc = [[MyTableViewController alloc] init]; NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; [controllers removeLastObject]; [controllers addObject:vc]; [self.navigationController setViewControllers:controllers animated:YES]; 

怎么样,当你closures你的UIViewController包含你的viewDidDisappear方法发送一个NSNotifcation的表,如下所示:

 - (void)viewDidDisappear:(BOOL)animated { [[NSNotificationCenter defaultCenter] postNotificationName:@"loadOtherVC" object:nil]; } 

而在你的父视图控制器将推动一个新的视图控制器,你添加一个观察者的通知就像这样:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(LoadOtherVC:) name:@"loadOtherVC" object:nil]; 

你应该有一个匹配select器的方法。

 - (void) LoadOtherVC:(NSNotification *) notification { // load your other view controller you want here } 

不要从顶层控制器popup它。 调用委托方法将popup视图closures导航控制器,然后推一个新的。

我喜欢亚历山大的解决scheme,但如果我是一个代表人,我不想使用通知。 所以在这种情况下,我们可以在viewDidDisappear方法中使用委托。

因此,在didSelectRowAtIndexPath方法中,您可以popup控制器 –

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [self.navigationController popViewControllerAnimated:YES]; } 

并在同一个视图控制器中,您正在popup的ViewController,调用viewDidDisappear方法中的委托方法,

 -(void)viewDidDisappear:(BOOL)animated{ [self.delegate cellPressedInTableViewControllerWithCalculationsModel:(id)anArgmentMyDelegateMethodTakes]; } 

然后在推送的控制器可以实现委托方法,并在该委托方法,你可以做任何你想要的。