【发布时间】:2011-09-03 09:51:44
【问题描述】:
我的主菜单上有一个常规的 UIButton,它当前启动了一个 UIViewController;对应的.m文件内容如下:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
documentPath = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:documentPath];
document = [UIDocumentInteractionController interactionControllerWithURL: targetURL];
document.delegate = self;
[document retain];
return self;
}
-(UIViewController *)documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller
{
return self;
}
-(void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
[document autorelease];
}
-(void)viewDidLoad
{
[super viewDidLoad];
[document presentPreviewAnimated: YES]; // ** CRASH **
}
-(void)viewDidUnload
{
[super viewDidUnload];
}
-(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
-(void)dealloc
{
[super dealloc];
}
我的 pdf 文件按预期加载,但是当我点击“完成”按钮时,文档会关闭,我只能盯着空白的 UIViewController - 可以说是如预期的那样。但是,如果我点击导航“返回”按钮,那么应用程序会在我的 viewDidLoad 方法中出现错误的访问错误而崩溃,在该方法中找到了对 presentPreviewAnimated 的调用。
如果有人可以看一下,我将不胜感激。
(顺便说一句,创建此视图控制器时没有NIB文件。是的,这本身就是错误的)
【问题讨论】:
-
我认为您的问题可能与您在委托中执行的自动释放有关(以及 initWithNib 方法中的保留)。
-
@onnoweb 如果没有保留,它将崩溃并显示以下内容:第 1 行:-[__NSCFType presentPreviewAnimated:]:无法识别的选择器发送到实例 0x1a32e0 第 2 行:*** 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException ', reason: '-[__NSCFType presentPreviewAnimated:]: unrecognized selector sent to instance 0x1a32e0' 我添加retain的原因是因为Apple告诉我们在UIDocumentInteractionControllerDelegate协议参考中。
-
嗯...我在我的一个应用程序中使用了相当多的 UIDocument,不做保留并且没有问题。如果将 UIDocument 代码从 initWithNib 移动到 viewDidLoad 会怎样?
-
我想知道问题是否在于您在视图创建期间执行此操作。这样当用户关闭文档预览时,它会返回到一个未完全形成的 UIView。所以也许首先构建并加载视图,然后从 viewDidAppear 执行 UIDocument ?
-
完美我的朋友!将 UIDocumentInteractionController 的 init 代码放在 viewDidAppear: 中,以及一个跟踪它是否是第一次查看的 BOOL 可以完美地工作。如果是第一个视图,则创建并推送文档。一旦我点击“完成”,viewDidAppear 就会再次触发,只是现在我的 BOOL 读取为 NO,(不是第一个视图)所以我调用 popToRootViewControllerAnimated: 效果很好。感谢您对此查询的支持。
标签: iphone ios uiviewcontroller uidocumentinteraction