【问题标题】:iOS Addressbook: Cannot setup an ABNewPersonViewController in storyboardiOS 通讯录:无法在情节提要中设置 ABNewPersonViewController
【发布时间】:2013-07-07 22:38:27
【问题描述】:

我在故事板中定义了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:我知道如何以编程方式进行设置,但我想在情节提要中进行。

编辑

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

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

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

编辑

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

【问题讨论】:

    标签: ios storyboard abaddressbook


    【解决方案1】:

    使用以下代码设置 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);
    

    【讨论】:

    • 感谢您的回答!但是我的问题不是通过程序创建 ABNewPersonViewController,我已经这样做了并且它有效。我的问题是在故事板中设置它。
    【解决方案2】:

    尝试这样做,在情节提要中 TabBarController 的连接检查器中,有一个头部 'Triggered Segues',建立从 'view controllers' 到 'ABNewPersonViewController' 的连接。运行你的应用程序,它会工作。

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

    干杯!!

    【讨论】:

    • 感谢您的回答!我查了一下:从标签栏视图控制器中,我触发了 3 个通过选择标签触发的导航控制器的 segues。所以标签栏控制器确实与控制 ABNewPersonViewController 的导航控制器链接。
    • 你呈现你的标签然后导航到后续的视图控制器,所以不需要将 TabBarController 直接连接到导航控制器,它在通过 TabBarController 呈现视图控制器之后,你可以进一步导航。跨度>
    • 我试过了:我删除了导航控制器,并将 ABNewPersonViewController 子类直接添加到标签栏控制器,它有一个触发的 segue。但是屏幕还是黑的……
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2013-09-29
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多