我在这个网站上尝试过几个答案,但似乎没有一个与我的问题有关
我有一个MasterDetail应用程序,它有两种我正在使用的segue。当您按下详细视图上的按钮时,它会使用推送segue并将另一个详细视图推送到该视图上。在新的detailview(刚推入的那个)中有一个按钮,它使用模态segue调用另一个UIView(表单)。
我想要做的是当用户选择一行时,UIAlertView将显示同时显示消息(不必处于相同时间)它解除了UIViewcontroller(模态)和 从推出的Viewcontroller返回 。基本上,我需要能够解雇所有的viewcontrollers,一个模态和一个push(nav),以便视图返回到他们开始的原始主屏幕。
我让UIAlertView工作正常,我可以通过使用[self.dismissViewControllerAnimated:YES completion:nil];
来解除模态viewcontroller,但我不知道如何解除下一个Viewcontroller(在导航控制器中)。使用此:[self.navigationController popToRootViewControllerAnimated:NO];
不起作用。
这是我想要调用函数删除所有视图的地方:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlWithIDAndChallenge];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
UIAlertView *message = [[UIAlertView alloc] initWithTitle@"Started" message:@"The challenge has begun!" delegate:nil cancelButtonTitle:@"OK!" otherButtonTitles:nil];
[message show]
//right here is where I would normally dismiss the modal VC
//here is where I would like to dismiss all VC
}
答案 0 :(得分:14)
如果需要,可以在iOS 6.0(及更高版本)项目中使用展开segue。例如,您可以:
在您的顶级视图控制器(您要解除到的那个,而不是您要从中展开的控制器)中,写一个放松segue方法,在这种情况下称为unwindToTopLevel
(就个人而言,如果segue对segue的目的地有什么指示,我发现它很有用,原因在我们到达下面的第3步时会变得明显) :
- (IBAction)unwindToTopLevel:(UIStoryboardSegue *)segue
{
NSLog(@"%s", __FUNCTION__);
}
在您将从中启动展开的Interface Builder场景中,control⌘/ / kbd> -drag从视图控制器图标到退出图标以创建展开segue:
通常你会从按钮到退出插座定义segue(你已经完成了),但是如果你想以编程方式调用segue,你可能想在控制器和展开插座之间创建它,就像如上所示。
你会得到一个小小的弹出窗口,包括你展开的segues的名字(来自呈现的控制器......就像魔法一样):
如果您要以编程方式调用segue,则必须在IB窗口左侧的文档大纲中选择展开segue,一旦完成,您可以放弃展开segue故事板ID:
我通常使用解开故事板ID的展开segue的名称,但你可以随意使用。
现在,完成后,您的警报视图可以调用segue:
- (IBAction)didTouchUpInsideButton:(id)sender
{
[[[UIAlertView alloc] initWithTitle:nil message:@"go home" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil] show];
}
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != [alertView cancelButtonIndex])
{
[self performSegueWithIdentifier:@"unwindToTopLevel" sender:self];
}
}
答案 1 :(得分:1)
从课程中你提出了你的模态视图
调用解除模态,然后在一段延迟后执行选择器,然后执行
这是示例代码
//Write this in the class from where you presented a modal View.
//Call the function from modal class when you want to dismiss and go to root.
- (void) dismissAndGoToRoot {
[self dismissViewControllerAnimated:YES completion:nil];
[self performSelector:@selector(gotoRoot) withObject:nil afterDelay:0.50];
}
- (void)gotoRoot {
[self.navigationController popToRootViewControllerAnimated:NO];
}
在这里你将调用函数
//就在这里我通常会解雇模态VC //这里是我想解雇所有VC的地方
[self.parentViewController dismissAndGoToRoot];
如果这不起作用,则在模态类中获取ParentViewController的实例变量,并在呈现模态视图控制器时分配。
答案 2 :(得分:0)
您可以尝试用
替换[self.dismissViewControllerAnimated:YES completion:nil];
self dismissViewControllerAnimated:YES completion:^{
[parentViewController.navigationController popToRootViewControllerAnimated:YES];
}
我相信parentViewController将指向呈现视图控制器,该块将导致父视图控制器的导航控制器弹出到根视图控制器。