2012-02-28 2 views
4

サブクラスのサブクラスがABNewPersonViewControllerです。わかっているように、ナビゲーションバーの[完了]ボタンをクリックすると、デリゲートメソッドABNewPersonViewControllerの「完了」ボタンを無効にする方法

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

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

私が必要とするのは、保存ボタンが押されるとすぐです。私は彼が行った変更を中止すべきかどうかの変更と

  • を望んでいるかどうかをユーザーに尋ねるUIView 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]; 
    } 
    
    } 
    

    は、私はそれ以上のUIAlertViewUIViewをロードしています。

  • 答えて

    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]; 
    } 
    
    +0

    私は保存ボタンをトリガするわけではありません' - (void)actionSave:(UIBarButtonItem *)sender'メソッドの中にあるアクションです。代わりに、別のビューにボタンをロードしています。また、ビュー内のいずれかのボタンをクリックすると、別のビューがロードされます。このビューのボタンをクリックすると、保存ボタンの操作をトリガする必要があります。私がこれをするとき、完了したボタンは割り当てが解除されます。それは私が直面している問題です。 –

    +1

    あなたは、(ABNewPersonViewControllerの)インスタンスへの強力な(保持された)参照を必要に応じてどこかに置いて、コントローラの割り当てを解除しないようにしましたか? – Jilouc

    +0

    質問を編集しました –

    関連する問題