如何弹出viewController,然后通过委托推送viewController

时间:2011-08-22 03:01:52

标签: iphone objective-c ios

我有一个UITableViewController,当按下一个单元格时,我希望控制器弹出自己,然后将控制器弹出,将另一个视图控制器推入堆栈。

我正在调用此方法,因为popped-to viewController是tableViewController的委托

我目前正在调用此方法并延迟它,因为否则,一切都搞砸了,等待动画结束。这样做似乎有点hacky,在我看来,如果有人的设备没有在我给出的分配的等待时间内弹出视图,它会失败。

以下是一些代码:

//**** 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];

似乎应该有更好的方法来弹出/推送将在动画结束后执行的委托。等待时间在我看来可能会导致意想不到的问题。

我也尝试过使用:

 performSelectorOnMainThread:withObject:waitUntilDone

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

我也看过这个问题: Delegation question 它让我这么远,但我很想知道是否有更好的方法来执行这样的任务, 谢谢。

编辑:我也尝试在NSInvocation的实例中包装该方法,我无法让它协调方法调用,直到动画完成后没有任意设置延迟

5 个答案:

答案 0 :(得分:37)

除了单个视图控制器的推送或弹出之外,最简单的方法是设置UINavigationController视图控制器数组。

例如,弹出然后推送视图控制器:

MyTableViewController *vc = [[MyTableViewController alloc] init];

NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[controllers removeLastObject];
[controllers addObject:vc];

[self.navigationController setViewControllers:controllers animated:YES];

答案 1 :(得分:4)

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

答案 2 :(得分:3)

当您解雇包含您在viewDidDisappear方法中发送NSNotifcation的表的UIViewController时如何:

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

在将推送新视图控制器的父视图控制器中,您为该通知添加一个观察者,如下所示:

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

您应该有一个与选择器匹配的方法。

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

答案 3 :(得分:0)

不要从顶级控制器弹出它。调用委托方法,该方法将从导航控制器中弹出视图,然后再打开一个新的。

答案 4 :(得分:0)

我喜欢Alexandre的解决方案,但如果我是代理人,我不想使用通知。因此,在这种情况下,我们可以在viewDidDisappear方法中使用委托。

因此,在didSelectRowAtIndexPath方法中,您可以弹出控制器 -

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

在同一个View Controller中,弹出的ViewController,在viewDidDisappear方法中调用委托方法,如 -

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

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