Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何以编程方式在UINavigationController中显示第二个模态ViewController_Ios_Objective C_Xcode_Ios6_Uinavigationcontroller - Fatal编程技术网

Ios 如何以编程方式在UINavigationController中显示第二个模态ViewController

Ios 如何以编程方式在UINavigationController中显示第二个模态ViewController,ios,objective-c,xcode,ios6,uinavigationcontroller,Ios,Objective C,Xcode,Ios6,Uinavigationcontroller,在我的UINavigationController视图中,用户可以按“添加”按钮,使用UIImagePickerController从相册中选择照片。当用户选择所需照片时,我想将他移动到AddPhotoViewController视图,在该视图中他可以添加标题和描述,然后他可以按“保存”按钮保存数据,关闭AddPhotoViewController视图并返回上一个UINavigationController视图。到目前为止,我只能推送AddPhotoViewControllerview,而不能作

在我的
UINavigationController
视图中,用户可以按“添加”按钮,使用
UIImagePickerController
从相册中选择照片。当用户选择所需照片时,我想将他移动到
AddPhotoViewController
视图,在该视图中他可以添加标题和描述,然后他可以按“保存”按钮保存数据,关闭
AddPhotoViewController
视图并返回上一个
UINavigationController
视图。到目前为止,我只能推送
AddPhotoViewController
view,而不能作为模式视图。我就是这样做的:

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
      AddPhotoViewController *apvc = [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];
      apvc.info = info;
      [self.navigationController pushViewController:apvc animated:YES];
      [self dismissViewControllerAnimated:YES completion:nil];
   }
上面的代码工作正常,但我想添加AddPhotoViewController作为模态视图。我想使用
presentModalViewController:animated:
,但在iOS 6.0中它被贬低了。我试过:

   [self presentViewController:apvc animated:YES completion:nil];
而不是:

   [self.navigationController pushViewController:apvc animated:YES];
但我得到了这个错误:

   Warning: Attempt to present <AddPhotoViewController: 0x1e183fc0> on <UINavigationController: 0x1d594a70> whose view is not in the window hierarchy!
警告:尝试显示其视图不在窗口层次结构中的对象!

在我关闭
UIImagePickerController
视图后,是否可以在
UINavigationController
视图上方添加一个模式视图?

为什么不使用segue?在故事板中设置你的segue,当从imagepickercontroller返回时,只需启动sequefrom代码


您可以参考seque的

先关闭当前模态控制器,然后再显示其他控制器。i、 e

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
          AddPhotoViewController *apvc = [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];
          apvc.info = info;
          [self dismissViewControllerAnimated:YES completion:nil];

          [self presentViewController:apvc animated:YES completion:nil];
   }

与@nkongara的答案类似,但通过使用完成块来避免任何奇怪的竞态条件,会更加健壮。此外,通过调用
[picker presentingViewController]
上的
dismissViewControllerAnimated:completion
,而不是假设
self
始终是显示视图控制器,代码更能防患于未然

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    AddPhotoViewController *apvc = [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];
    apvc.info = info;
    [[picker presentingViewController] dismissViewControllerAnimated:YES completion:^{
        [self presentViewController:apvc animated:YES completion:nil];
    }];
}

正如其他人在这里提到的,不可能在当前模态视图和父视图之间添加第二模态视图。我解决了我的问题,但这与其说是真正的解决方案,不如说是一种黑客行为。如果有人想做类似的事情,这是解释的链接:

你可以得到你想要的导航,这多亏了放松阶段的魔力

在第一个viewController中,实现一个展开序列

- (IBAction)unwindSegue:(UIStoryboardSegue*)segue
{
    NSLog (@"unwound");
       //you can extract data from your "addPhoto" viewController here
       //via segue.sourceViewController
}
确保在头文件中声明它

在“addPhoto”视图控制器中,添加某种类型的“关闭”按钮,然后按住CTRL键并拖动到控制器底部的“退出”符号。应可选择展开顺序

要访问
addPhoto
,您可以通过模式进行演示-但请imagePickerController进行演示:

- (void) imagePickerController:(UIImagePickerController *)picker
 didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIViewController* addPhotoController = 
                [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];

    addPhotoController.infoDict = info; //passing the image data to addPhoto

    [picker presentViewController:addPhotoController 
                         animated:YES 
                       completion:nil];
}

因此,您可以获得两层呈现,但在每种情况下,都是前一个控制器进行呈现。不要关闭imagePickerController。当执行“展开”序列时,它将为您解决关闭问题。

问题是,如果我先关闭我的UIImagePickerController,然后启动一个序列,我的UINavigationController将可见(我知道只有一秒钟左右,但它仍然可见)。我希望用户在拾取照片后立即看到AddPhotoControllerView。据我所知,在UIImagePickerController视图被取消之前,必须添加AddPhotoViewController视图。您是否尝试过在没有任何动画的情况下不设置视图控制器推送的动画?是的,我尝试过,即使没有动画,您仍然可以看到UINavi在加载新的模态视图之前,我在gationController视图上停留了大约一秒钟。我找到了我在上面发布的黑客解决方案。无论如何,谢谢。如果我先关闭当前模态视图控制器,我将拥有parentview(在本例中为UINavigationController)在显示新模式视图之前显示一秒钟。我要找的是在当前模式视图和父视图之间挤压新模式视图,这样如果我关闭当前模式视图,用户将看到新模式视图而不是父视图。你认为有可能吗?使用索引或其他什么?据我所知,不关闭当前模式视图ext,无法打开新的模式上下文。我不确定您对使用所选图像再次打开另一个模式的要求是什么,我建议您继续将AddPhotoViewController推入navController,使用AddPhotoViewController完成操作后,弹出回您的父视图。感谢您的回答,但这不是我在寻找什么。我已经在上面解释了我需要什么。我明白了…我不确定你尝试在iOS中做什么有多标准,我想不出一个简单的方法来做这件事,不会让人感觉不舒服。相反,这是怎么回事?展示一个UIAvigationController,其中一个UIImagePickerController实例初始化为rootViewController。然后,在r在UIImagePickerController中选择图像后,您可以将AddPhotoViewController推送到显示的UINavigationController上。成功添加照片后,您可以关闭显示的UINavigationController。这不完全是您要求的,但可能更标准。。。