2

私はbarButtonItem ハンドラーメソッドを使用しており、ナビゲーション コントローラーへの参照が必要です。しかし、ナビゲーション コントローラーの参照が保存されていません。何か案が?

#import "ReportViewController.h"
#import "CenterViewAnimationUtility.h"

@implementation ReportViewController

- (void)viewDidLoad
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button addTarget:[CenterViewAnimationUtility class] action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
}

//next file ..

#import "CenterViewAnimationUtility.h"

@implementation CenterViewAnimationUtility

+ (void)buttonPressed:(UIBarButtonItem *)barButtonItem {

    UINavigationController *navigationController = barButtonItem.//..
}
4

2 に答える 2

2

このメソッドがナビゲーションコントローラーにあるビューコントローラーにあると仮定すると、次のように簡単に実行できます。

UINavigationController *navigationController = self.navigationController;

質問 - ボタン ハンドラーがクラス メソッドである理由は何ですか? このソリューションは、ボタン ハンドラーを適切なインスタンス メソッドにした場合にのみ機能します。

ターゲットをクラス メソッドにする必要がある場合は、ボタンのtargetプロパティからビュー コントローラーへの参照を取得できます。

UIViewController *target = barButtonItem.target;
UINavigationController *navigationController = target.navigationController;

アップデート:

この場合、ボタンのターゲットがView Controllerではないという事実に基づいて、このソリューションは機能しません。

于 2013-10-26T03:24:58.720 に答える
0

さまざまなView Controllerのさまざまなボタンで使用されるため、クラスメソッドにしているということは正しく理解できていますか?

その場合、回避策として、各ボタンがターゲット/アクション メッセージを独自の UIViewController 内のメソッドに送信し、そのメソッドが共通クラス メソッドを呼び出して、UINavigationController をパラメーターとして渡すようにします。

UINavigationController *navController = self.navigationController;
[<classObject> buttonPressed:(UIBarButtonItem *)barButtonItem 
   fromNavigationcontroller:(UINavigationController *)navController;

追加のパラメーターを受け入れるには、明らかにクラス メソッドを書き直す必要があります。

    + (void)buttonPressed:(UIBarButtonItem *)barButtonItem 
      fromNavigationcontroller:(UINavigationController *)navController{
于 2013-11-05T10:34:59.277 に答える