0

デバイスのアドレスブックへの連絡先を作成するために使用するカスタム UIActivity があります。この UIActivity で、ABNewPersonViewController を作成し、それを UINavigationController 内に配置して、UIActivity の

- (UIViewController *)activityViewController

問題は、リリースされた UINavigationController への参照が原因で、iPad でクラッシュが発生することです。メッセージのタイプは次のとおりです。

*** -[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

4

1 に答える 1