2

私は AddressBook プロジェクトに取り組んでいます。私の要件の 1 つは、アプリケーションを使用して新しい連絡先を手動で追加するときに、「組織フィールド」の値がユーザーによって入力されているかどうかを確認する必要があることです。

ナビゲーション バーに Add(+) ボタンがあり、次のコード スニペットがあります。

UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self 
action:@selector(add:)];
self.navigationItem.rightBarButtonItem = addButton;

この追加ボタンをクリックすると、ネイティブのアドレス帳による現在のモーダル ビューが表示されます。

-(void)add:(id)sender
{
    ABNewPersonViewController *view = [[ABNewPersonViewController alloc] init];
    view.newPersonViewDelegate = self;
    UINavigationController *newNavigationController = [[UINavigationController alloc] initWithRootViewController:view];
    [self presentModalViewController:newNavigationController animated:YES];
}

- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person
{
    newPersonView.displayedPerson = person;
    [self dismissModalViewControllerAnimated:YES];
    [table reloadData];
}

連絡先がアドレス帳に保存される前に、ユーザーが「組織フィールド」を追加したかどうかを確認したい。空白/nilの場合、組織値の入力を求めるアラートボックスを表示したいと思います。これは必須です。ユーザーが組織の値を指定すると、連絡先がアドレスブックに保存されます。

編集: Fabio によって以下に提案されているように、コードを更新しました..

- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person{

NSString *company = [NSString stringWithFormat: @"%@", ABRecordCopyValue(person, kABPersonOrganizationProperty)];
if ([company isEqualToString: @"(null)"]) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Value Required!" message:@"Please provide some value for ORGANIZATION Field..." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
}
else
{
 newPersonView.displayedPerson = person;
 [self dismissModalViewControllerAnimated:YES];
}
}

これにより、ユーザーにアラートを表示してフィールド値を提供することができます。また、作成された後続のレコードを更新しています。ただし、MODAL VIEW が非表示になっているため、詳細ビュー (ネイティブ アプリの情報画面)​​ には連絡先に関する情報が表示されません。

また、キャンセル ボタンは通常の方法では機能しません。提供してキャンセルを押しても、フィールド値の提供を繰り返し求められるため、アプリに戻ることはできません。

誰でも私を導くことができます!

ありがとうございます。それでは、お元気で

4

1 に答える 1

1

ABNewPersonViewControllerを使用してこれを行うための文書化された方法はありません。これは、デリゲートメソッドが呼び出されたときに、その人がABNewPersonViewControllerによってすでに保存されているためです。以前は、独自の「コントローラーの挿入」を作成して使用する必要がありました。

しかし、私はこの回避策を試し、この動作を取得しました(iOS 6の場合):

デリゲートメソッドで

- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person

作成された新しい人への参照を受け取ります。次に、保存された人にアクセスして、会社が編集されているかどうかを確認できます。そうでない場合は、単に電話しないでください

[self dismissModalViewControllerAnimated:YES];

ABNewPersonViewControllerはその位置に留まり、会社をコンパイルするように求めるアラートをユーザーに表示できます。フィールドはコンパイルされたままになり、ABNewPersonViewControllerは作成された新しいユーザーに「リンク」されます。

次に、ユーザーは次のことができます。

  • 会社のフィールドをコンパイルします->[保存]をタップすると、保存された人が更新され、代理人に新しいデータが提供されるため、ビューコントローラーを正しく閉じることができます
  • [キャンセル]をタップします->キャンセルを受け取り、その人はABNewPersonViewController自体によって削除されます

しかし...私はこの振る舞いがどこにも文書化されていないので、

  • 他のバージョンでも動作します
  • レビュープロセスに「存続」します(以前はプライベートAPIを使用していませんが、ユーザーが[保存]をタップしたときにビューコントローラーを「閉じない」かどうかはわかりません)。

よろしくファビオ

于 2012-10-31T11:12:46.593 に答える