4

をサブクラス化するクラスがありABNewPersonViewControllerます。私が理解しているように、ナビゲーション バーの [完了] ボタンをクリックすると、デリゲート メソッド

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

呼ばれます。ただし、デリゲート メソッドに入る前に、変更はアドレス帳に保存されます。

私が必要とするのは、保存ボタンが押されるとすぐです。UIViewユーザーに尋ねる2つのボタンをロードする必要があります。

  1. 彼が変更を望んでいるかどうか
  2. 行った変更を中止する必要があるかどうか、

ただし、これは変更がアドレス帳に反映される前に行う必要があります。の最初のボタンをクリックするだけでUIView、変更がアドレス帳に保存されます。

2 番目のボタンをクリックすると、ビューが消えて、ロードされた場所からビュー コントローラー クラスに戻る必要がありますUIView

私の質問は、変更がアドレス帳に反映される前に、保存ボタンのクリック時にビューをどのようにロードするかです

カスタム保存ボタンを作成しました

UIBarButtonItem *okBtn =  self.navigationItem.rightBarButtonItem;
UIBarButtonItem *saveBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:okBtn.target action:okBtn.action];
self.navigationItem.rightBarButtonItem =saveBtn;
[saveBtn release];

保存ボタン アクションでは、コントロールはデリゲート メソッドに移動します。

 - (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person`  .

コントロールをカスタム メソッドに移動してUIView、編集内容がアドレス帳に保存される前にロードできるようにします。

編集:ロードするとABNewPersonViewController

 ABPersonViewController *displayVcardViewController = (ABPersonViewController*)[self.navigationController visibleViewController];

ABRecordRef person = displayVcardViewController.displayedPerson;

EditAddressNewPersonDetailViewController *newVCardViewController = [[EditAddressNewPersonDetailViewController alloc] init];
newVCardViewController.displayedPerson = person;
newVCardViewController.newPersonViewDelegate = self;
newVCardViewController.isEditingMode = YES;

[self.navigationController setToolbarHidden:YES];
[self.navigationController pushViewController:newVCardViewController animated:YES];
[newVCardViewController release];

この強力な参照は既にありますか、そうでなければ、どこに強い参照を含める必要がありますか。

の上

- (void)actionSave:(UIBarButtonItem *)sender {

if([[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]) { 
    [self.myView setFrame:CGRectMake(0, 0, 320, 480)];

    [[UIApplication sharedApplication].keyWindow addSubview:self.myView];

           UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@""
                                                              delegate:self
                                                     cancelButtonTitle:@"Do"
                                                destructiveButtonTitle:@"Cancel"
                                                     otherButtonTitles: nil];
           action.tag = 101; 
          [action showInView:self.view];
          [action release];
}

}

UIViewその上にwithをロードしUIAlertViewています。

4

1 に答える 1

4

更新: iOS 7.0 以降でABNewPersonViewControllerは、サブクラス化できなくなり、これは機能しなくなります。

まず、rightBarButtonItemオーバーライドする前にデフォルトへの参照を保持します。をサブクラス化している場合ABNewPersonViewController、次のviewDidLoadようになります。

- (void)viewDidLoad {
    [super viewDidLoad];

    // Store the old button item into a custom property
    // @property (nonatomic, retain) UIBarButtonItem *defaultRightBarButtonItem;

    self.defaultRightBarButtonItem = self.navigationItem.rightBarButtonItem;

    UIBarButtonItem *saveBtn = [[UIBarButtonItem alloc] 
                                initWithBarButtonSystemItem:UIBarButtonSystemItemSave 
                                target:self 
                                action:@selector(actionSave:)];
    self.navigationItem.rightBarButtonItem = saveBtn;
    [saveBtn release];
}

そして、カスタム アクション メソッドでデフォルト ターゲットのデフォルト アクションを呼び出します。

- (void)actionSave:(UIBarButtonItem *)sender {

    // Do what you want to do before the data is saved
    // ....
    // ....

    // Trigger the default action
    [self.defaultRightBarButtonItem.target 
     performSelector:self.defaultRightBarButtonItem.action
     withObject:self.defaultRightBarButtonItem.target];
}
于 2012-03-13T13:15:57.253 に答える