Cocoa touch presentModalViewController无法显示

Cocoa touch presentModalViewController无法显示,cocoa-touch,uiviewcontroller,uikit,Cocoa Touch,Uiviewcontroller,Uikit,首先,我对Objective C世界还不熟悉,所以我的问题可能听起来很幼稚。即使是方法的结构也可能不太合适,所以请宽容我。我相信我会在前进中学习 我有一个容器视图控制器“DeckViewController”,其中包含另一个视图控制器“CardDetails”。CardDetails有一个滚动视图,用于一次加载3个自定义UIView(CustomWebView),其中加载HTML。这些视图中加载的HTML包含图像,要求用户单击页面中的任何图像后,该图像将在QLPreviewController中

首先,我对Objective C世界还不熟悉,所以我的问题可能听起来很幼稚。即使是方法的结构也可能不太合适,所以请宽容我。我相信我会在前进中学习

我有一个容器视图控制器“DeckViewController”,其中包含另一个视图控制器“CardDetails”。CardDetails有一个滚动视图,用于一次加载3个自定义UIView(CustomWebView),其中加载HTML。这些视图中加载的HTML包含图像,要求用户单击页面中的任何图像后,该图像将在QLPreviewController中打开。我已经将HTML中的所有图像包装在一个锚标记中,以确保
shouldStartLoadWithRequest
委托处理该图像的加载

这个处理程序是在CustomWebView类中编写的,我正在尝试使用CustomWebView的父视图控制器(即CardDetails)加载预览控制器

我已经跟踪了代码,它产生了正确的值,但是模态视图控制器根本没有出现。我可能只是错过了一个小环节,或者错过了这里的全部要点。非常感谢您的帮助和指导

下面给出了shouldStartLoadWithRequest委托处理程序的代码片段-

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
NSString* strExtension;
NSLog(@"THE Path of the image %@",request);
NSString *imageName = [[[request URL] path] lastPathComponent];
NSArray *comt = [imageName componentsSeparatedByString:@"."];
strExtension = [comt objectAtIndex:[comt count]-1];
NSLog(@"file extension %@",strExtension);
if ([strExtension isEqualToString:@"png"] || [strExtension isEqualToString:@"jpeg"] || [strExtension isEqualToString:@"jpg"]) {
    NSLog(@"######v %@",[[request URL] path]);
    QLPreviewController *previewController = [[QLPreviewController alloc] init];
    ImageViewController *imagecontrller = [[ImageViewController alloc] init];
    previewController.dataSource = imagecontrller;
    previewController.delegate = imagecontrller;
    [imagecontrller setImageURL:[request URL]];
    previewController.currentPreviewItemIndex = 0;
    [parentvc.navigationController presentModalViewController:previewController animated:YES];
    [previewController release];
    UIAlertView* alertView=[[UIAlertView alloc] initWithTitle:@"Alert" message:imageName delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [alertView show];
    [alertView release];
    //[imagecontrller release];


    return NO;
}else {
    return YES;
}

}

通常,如果
[UIViewController presentModalViewController:animated:
不起作用,这是因为现有视图控制器没有其
parentViewController
属性集。基本上,它没有正确地连接到视图层次结构中。有各种各样的原因,但是。。。这是你应该调查的

您需要(a)找到另一个具有父视图控制器的视图控制器,并让其执行presentModal,或者(b)仔细地重新编写代码,以便每个视图控制器都知道其父视图,或者


(c) 这里的简单解决方案是保留对顶级视图控制器的引用,并从那里执行presentModal。当您准备关闭模态视图控制器时,它实际上可以在自身上调用
dismissModalViewControllerAnimated:
,这将被转发到显示它的视图控制器。方便。

您可能希望对问题中的文本进行一点结构化,以便于阅读。例如,进入一些部分。感谢您指出这一点。我以后一定会这么做的。谢谢你的帮助。我按照您的建议构建了代码,并更改了调用[\u parentView presentModalViewController:previewController-animated:YES];而不是[\u parentView.navigationController presentModalViewController:previewController-animated:YES];成功了,欢迎来到StackOverflow。我很高兴能帮上忙。请点击我的答案旁边的灰色复选标记,现在你有它的工作。