2013-07-04 63 views
1

我有一個在故事板中定義的ABNewPersonViewController的子類,並按照文檔的要求將其嵌入在導航控制器中。導航控制器本身由標籤欄控制器控制。在身份檢查員中,該類已被設置爲子類。
enter image description here
在子類ABNewPersonViewController我做了測試初始化​​中viewDidLoadiOS地址簿:無法在故事板中設置ABNewPersonViewController

- (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初始化。這工作正常。當子類從storyboard實例化時,它會收到initWithCoder:。爲了測試它,我在下面的方式來實現initWithCoder:

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

在這種情況下,確實顯示的ABNewPersonViewController進入面具,但導航欄 未顯示 空。我知道這個初始化hack是錯誤的,但是有沒有人知道如何做到這一點?

編輯

導航欄沒有顯示,因爲我將它設置爲隱藏。通常會顯示,但「完成」和「取消」按鈕丟失。這當然並不奇怪,因爲超類不是由initWithCoder:初始化的,而是由init初始化的。
問題仍然在於爲什麼沒有顯示輸入掩碼,而只顯示黑屏。

回答

1

嘗試這樣做,在故事板中的TabBarController的連接檢查器中,有一個頭'Triggered Segues',從'視圖控制器'連接到'ABNewPersonViewController'。運行你的應用程序,它會工作。

如果您需要進一步導航,請從ABNewPersonViewController指向ChildOfABNewPersonViewController,然後您需要將ABNewPersonViewController連接到NavigationController和NavigationController的rootviewcontroller以ChildOfABNewPersonViewController。

乾杯!

+0

謝謝您的回答!我查了一下:從標籤欄視圖控制器中,我已經觸發了通過選擇一個標籤觸發的3個導航控制器。因此,標籤欄控制器IS確實與控制ABNewPersonViewController的導航控制器鏈接。 –

+0

您將顯示您的選項卡,然後導航到後續的視圖控制器,因此不需要將TabBarController直接連接到導航控制器,在通過TabBarController呈現視圖控制器後,您可以進一步導航。 – Say2Manuj

+0

我試過了:我刪除了導航控制器,並將ABNewPersonViewController子類直接添加到標籤欄控制器,並且它有一個觸發的繼續。但屏幕仍然是黑色的... –

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); 

------------- OR ---------

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); 
+0

感謝您的回答!然而,我的問題是不按程序創建ABNewPersonViewController,我已經完成了這個工作。我的問題是在故事板中設置它。 –