6

我在这个网站上尝试了一些答案,但似乎都与我的问题无关

我有一个 MasterDetail 应用程序,它有两种我正在使用的 segues。当您按下详细视图上的按钮时,它会使用 push segue 并将另一个详细视图推送到该按钮上。在新的detailview(刚刚被按下的那个)中有一个按钮,它使用模态segue调用另一个UIView(表单)。

我想要做的是当用户选择一行时, UIAlertView 将显示一条消息,同时(不必同时)它会关闭 UIViewcontroller (模态)并返回从被推送的 Viewcontroller 中。基本上,我需要能够关闭所有视图控制器、一个模式和一个推送(导航),以便视图返回到它们开始时的原始主屏幕。

我的 UIAlertView 工作正常,我可以通过使用来关闭模态[self.dismissViewControllerAnimated:YES completion:nil];视图控制器,但我不知道如何关闭下一个 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

}
4

3 回答 3

15

如果需要,在 iOS 6.0(及更高版本)项目中,您可以使用展开转场。例如,您可以:

  1. 在您的顶级视图控制器(您想要展开控制器,而不是您要从中展开的控制器中,编写一个展开转场方法,在这种情况下称为unwindToTopLevel(我个人认为,如果转场有一些指示,它很有用至于 segue 的目的地是什么,原因在我们进入下面的第 3 步时将变得显而易见):

    - (IBAction)unwindToTopLevel:(UIStoryboardSegue *)segue
    {
        NSLog(@"%s", __FUNCTION__);
    }
    
  2. 在您将启动展开的 Interface Builder 场景中,control ⌘从视图控制器图标 - 拖动到退出图标以创建展开转场:

    在此处输入图像描述

    通常,您会定义从按钮到出口插座的转场(您就完成了),但如果您想以编程方式调用转场,您可能希望在控制器和展开插座之间创建它,如上所示。

  3. 你会得到一个小弹出窗口,其中包括你的 unwind segues 的名称(来自呈现的控制器......就像魔术一样):

    在此处输入图像描述

  4. 如果您要以编程方式调用该转场,则必须在 IB 窗口左侧的文档大纲中选择该展开转场,一旦完成,您可以为展开转场指定一个故事板 ID:

    在此处输入图像描述

    我通常使用 unwind segue 的名称作为情节提要 ID,但您可以使用任何您想要的名称。

  5. 现在,完成此操作后,您的警报视图可以调用 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];
        }
    }
    
于 2013-07-12T03:34:29.263 回答
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 的实例变量,并在呈现模态视图控制器时分配。

于 2013-07-12T02:37:59.697 回答
0

您可以尝试替换[self.dismissViewControllerAnimated:YES completion:nil];

self dismissViewControllerAnimated:YES completion:^{
    [parentViewController.navigationController popToRootViewControllerAnimated:YES];
}

我相信 parentViewController 将指向呈现视图控制器,并且该块将导致父视图控制器的导航控制器弹出到根视图控制器。

于 2013-07-12T02:29:57.373 回答