2013-07-04 2 views
1

У меня есть подкласс ABNewPersonViewController, определенный в раскадровке, и встроенный там в контроллер навигации, как требуется документами. Контроллер навигации сам управляется контроллером панели вкладок. В инспекторе идентификации класс был установлен в подкласс.
enter image description here
В подклассах ABNewPersonViewController я инициализация теста в viewDidLoad:iOS Addressbook: Невозможно настроить 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: Я знаю, как настроить его программно, но я хотел бы сделать это в раскадровке.

EDIT

Когда я сделать это программно, подкласс инициализируется alloc & init. Это работает правильно. Когда подкласс создается из раскадровки, он получает initWithCoder:. Чтобы проверить это, я осуществил initWithCoder: следующим образом:

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

В этом случае, действительно отображается запись маска ABNewPersonViewController, но навигационный бар не показан пустым. Я знаю, что этот взлом инициализации ошибочен, но кто-нибудь знает, как это сделать правильно?

EDIT

Панель навигации не был показан, потому что я поставил его скрытым. Обычно это отображается, но кнопки «done» и «cancel» отсутствуют. Это, конечно, не удивительно, потому что суперкласс не инициализирован initWithCoder:, а init.
По-прежнему возникает вопрос, почему маска ввода не отображается, а только черный экран.

ответ

1

Попробуйте сделать это, в инспекторе связи TabBarController в раскадровке, есть голова «Triggered Segues», подключиться к «контроллерам представлений» к «ABNewPersonViewController». Запустите приложение, оно будет работать.

Если вам нужно дополнительно провести, скажем, от ABNewPersonViewController к ChildOfABNewPersonViewController, то вам необходимо подключить ABNewPersonViewController к NavigationController и RootViewController NavigationController к ChildOfABNewPersonViewController.

Cheers !!

+0

Спасибо за ваш ответ! Я просмотрел его: из контроллеров представления панели табуляции я инициировал segues для 3 навигационных контроллеров, которые запускаются путем выбора вкладки. Таким образом, контроллер панели вкладок действительно связан с контроллером nav, который управляет 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); 

------------- ИЛИ ---------

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 по программе, я сделал это, и она работает. Моя проблема состоит в том, чтобы настроить его в СТОРОНЕ. –

Смежные вопросы