UIActivity 自定义 activityViewController 在 iPad 上崩溃

Posted

技术标签:

【中文标题】UIActivity 自定义 activityViewController 在 iPad 上崩溃【英文标题】:UIActivity custom activityViewController crash on iPad 【发布时间】:2013-08-30 12:37:27 【问题描述】:

我有一个自定义 UIActivity,我使用它来创建设备地址簿的联系人。在这个 UIActivity 中,我创建了一个 ABNewPersonViewController,将它放在 UINavigationController 中,然后在 UIActivity 中返回

- (UIViewController *)activityViewController

问题是在 iPad 上由于引用了已发布的 UINavigationController 而导致崩溃。消息类型:

*** -[UINavigationController _viewControllerForSupportedInterfaceOrientations]: message sent to deallocated instance 0xa6f1660

同样在我的控制器关闭后,当界面改变方向时,iPad 不会自动旋转视图。

我使用的代码如下:

在 UIActivity 中

- (void)prepareWithActivityItems:(NSArray *)activityItems
    
    // Prepare the AB View Controller
    ABRecordRef aContact = ABPersonCreate();
    CFErrorRef error = NULL;

    ABRecordSetValue(aContact, kABPersonKindProperty, kABPersonKindOrganization, &error);
    ABRecordSetValue(aContact, kABPersonOrganizationProperty, @"Apple Inc.", &error);

    ABMultiValueRef phone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(phone, @"+1 2345 784513", kABWorkLabel, NULL);
    ABRecordSetValue(aContact, kABPersonPhoneProperty, phone, &error);
    CFRelease(phone);

    self.newContactVC.title = @"New company";
    self.newContactVC.displayedPerson = aContact;
    [self.navigation setViewControllers:[NSArray arrayWithObject:self.newContactVC]];

    CFRelease(aContact);


- (UIViewController *)activityViewController
   
    return self.navigation;


// Dismisses the new-person view controller.
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person

    [self activityDidFinish:YES];

在调用此 UIActivity 的 ViewController

- (IBAction)showActionsSheet:(id)sender         
    AddToAddressBookActivity *abActivity = [[AddToAddressBookActivity alloc] init];
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:nil
                                                                             applicationActivities:[NSArray arrayWithObject:abActivity]];

    activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll];

    if (!self.popover || ![self.popover isPopoverVisible]) 
        self.popover = [[UIPopoverController alloc] initWithContentViewController:activityVC];
        [self.popover setDelegate:self];
        self.popover.passthroughViews = nil;
        [self.popover presentPopoverFromRect:self.showASBtn.frame
                                      inView:self.view
                    permittedArrowDirections:UIPopoverArrowDirectionAny
                                    animated:YES];
    

任何帮助将不胜感激。

演示项目链接: http://ge.tt/23MeOYq/v/0?c

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,除了在关闭活动视图控制器后在旋转时发生崩溃。就我而言,我在故事板设置中将自定义视图控制器显示为“全屏”,并将其更改为显示为“表单”时崩溃消失了。不过我不知道为什么会有所不同。

关于在自定义视图控制器关闭后您的自动旋转不起作用,请尝试将完成处理程序添加到您的活动视图控制器以使您的弹出视图控制器 ivar 为零。我注意到,如果我不这样做,自定义活动和自定义视图控制器不会被释放,并且不会发生自动旋转。例如:

avc.completionHandler = ^(NSString* activityType, BOOL completed)
    if ( UIUserInterfaceIdiomPad == [UIDevice currentDevice].userInterfaceIdiom )
        self.popover = nil;
;

另外,请查看"activityviewcontroller not dismissing" 的帖子,我发现它很有帮助。

【讨论】:

以上是关于UIActivity 自定义 activityViewController 在 iPad 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义 UIActivityViewController 以仅包含自定义 UIActivity 类型?

自定义 UIActivity 的主题

UIActivity 自定义 activityViewController 在 iPad 上崩溃

自定义 UIActivity :图像图标反转颜色

自定义 UIActivity:ios8 中提供的未知活动项

iOS 8 自定义 UIActivity 图片黑色背景色