我有一个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的实例中包装该方法,我无法让它协调方法调用,直到动画完成后没有任意设置延迟
答案 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];
}
然后在推送的控制器中可以实现委托方法并在该委托方法中,你可以做任何你想做的事。