1

ABNewPersonViewControllerドキュメントで要求されているように、ストーリーボードで定義されたサブクラスがあり、ナビゲーションコントローラーに埋め込まれています。ナビゲーション コントローラー自体は、タブ バー コントローラーによって制御されます。ID インスペクタでは、クラスはサブクラスに設定されています。
ここに画像の説明を入力
サブクラス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 の接続インスペクタに、「Triggered Segues」というヘッドがあり、「View Controllers」から「ABNewPersonViewController」に接続します。アプリを実行すると、動作します。

ABNewPersonViewController から ChildOfABNewPersonViewController など、さらにナビゲートする必要がある場合は、ABNewPersonViewController を NavigationController に接続し、NavigationController の rootviewcontroller を ChildOfABNewPersonViewController に接続する必要があります。

乾杯 !!

于 2013-07-04T20:46:17.717 に答える