1

我有一个ABNewPersonViewController在故事板中定义的子类,并根据文档的要求嵌入到导航控制器中。导航控制器本身由标签栏控制器控制。在身份检查器中,类已设置为子类。
在此处输入图像描述
在子类ABNewPersonViewController中,我在以下位置进行测试初始化viewDidLoad​​:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.newPersonViewDelegate = self;

    ABRecordRef newPerson= ABPersonCreate();
    CFErrorRef error = NULL;
    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, CFSTR("First"), &error);
    ABRecordSetValue(newPerson, kABPersonLastNameProperty, CFSTR("Last"), &error);
    assert(!error);
    [self setDisplayedPerson:newPerson];
}  

在我的子类中,我也实现了委托方法newPersonViewController:didCompleteWithNewPerson:,但这并不重要。
当我在标签栏控制器中选择标签时,会显示黑屏。
知道我做错了什么吗?
PS:我知道如何以编程方式进行设置,但我想在情节提要中进行。

编辑

当我以编程方式执行此操作时,子类由alloc&初始化init。这可以正常工作。当子类从情节提要中实例化时,它会收到initWithCoder:. 为了测试它,我initWithCoder:通过以下方式实现:

- (id)initWithCoder:(NSCoder*)coder{  
    self = [super init];  
    return self; 
}

ABNewPersonViewController在这种情况下,确实显示了的入口掩码,但导航栏没有显示为空。我知道这个初始化技巧是错误的,但是有人知道如何正确地做吗?

编辑

导航栏未显示,因为我将其设置为隐藏。通常会显示,但缺少“完成”和“取消”按钮。这当然不足为奇,因为超类不是由 初始化的,initWithCoder:而是由初始化的init
问题仍然是为什么不显示输入掩码,而只显示黑屏。

4

2 回答 2

2

使用以下代码设置 ABNewPersonViewController,它对我来说很好:

  ABRecordRef newPerson= ABPersonCreate();
    CFErrorRef error = NULL;
    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, CFSTR("Fname"), &error);
    ABRecordSetValue(newPerson, kABPersonLastNameProperty, CFSTR("Lanme"), &error);
    NSAssert(!error, @"something bad happend here.");


    ABNewPersonViewController* newPersonViewController = [[ABNewPersonViewController alloc] init];
    [newPersonViewController setDisplayedPerson:newPerson];
    [newPersonViewController setNewPersonViewDelegate:self];


    [self presentModalViewController:newPersonViewController animated:YES];

    CFRelease(newPerson);

- - - - - - - 或者 - - - - -

ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
            //  picker.unknownPersonViewDelegate = self;
            picker.displayedPerson = aContact;
            picker.allowsAddingToAddressBook = YES;
            picker.allowsActions = YES;
            picker.alternateName = @"";
            picker.title = @"Add to Contacts";
            picker.message = @"";
            [picker setHidesBottomBarWhenPushed:YES];
            [self.navigationController pushViewController:picker animated:YES];

或者要添加新联系人或添加到现有联系人,您可以使用以下之一:

ABRecordRef aContact = ABPersonCreate();
    CFErrorRef anError = NULL;
    // store mobile number
    ABMultiValueRef mobilenumber = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    bool didAdd = ABMultiValueAddValueAndLabel(mobilenumber, (__bridge CFTypeRef)(number), kABPersonPhoneMobileLabel, NULL);

    //store email address
    NSString *strEmail = [NSString stringWithFormat:@"%@",number];
    strEmail = [strEmail stringByReplacingOccurrencesOfString:@"mailto:" withString:@""];

    ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABPersonEmailProperty);
    bool didAddEmail = ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFTypeRef)(strEmail), kABOtherLabel, NULL);


    if (didAdd == YES || didAddEmail== YES) {
        ABRecordSetValue(aContact, kABPersonEmailProperty, mobilenumber, &anError);
        ABRecordSetValue(aContact, kABPersonEmailProperty, emailMultiValue, &anError);

        if (anError == NULL) {
            ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
            //  picker.unknownPersonViewDelegate = self;
            picker.displayedPerson = aContact;
            picker.allowsAddingToAddressBook = YES;
            picker.allowsActions = YES;
            picker.alternateName = @"";
            picker.title = @"Add to Contacts";
            picker.message = @"";
            [picker setHidesBottomBarWhenPushed:YES];
            [self.navigationController pushViewController:picker animated:YES];

//            UINavigationController *newNavigationController = [[UINavigationController alloc] initWithRootViewController:picker];
//            
//            [self presentViewController:newNavigationController animated:YES completion:nil];
//            
            picker = nil;
        } else {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                            message:@"Could not create unknown user"
                                                           delegate:nil
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:nil];
            [alert show];
            alert = nil;
        }
    }
    CFRelease(mobilenumber);
    CFRelease(aContact);
于 2013-07-05T07:10:37.023 回答
1

尝试这样做,在故事板中 TabBarController 的连接检查器中,有一个头部“触发的 Segues”,建立从“视图控制器”到“ABNewPersonViewController”的连接。运行你的应用程序,它会工作。

如果您需要进一步导航,例如从 ABNewPersonViewController 到 ChildOfABNewPersonViewController,那么您需要将 ABNewPersonViewController 连接到 NavigationController 并将 NavigationController 的 rootviewcontroller 连接到 ChildOfABNewPersonViewController。

干杯!!

于 2013-07-04T20:46:17.717 回答