1

私は通常のUIButtonのためにこれを見てきました:

NSArray *actions = [viewController.addButton actionsForTarget:viewController forControlEvent:UIControlEventTouchUpInside];
XCTAssertTrue([actions containsObject:@”addNumbers:”], @””);

しかし、今は rightBarButtonItem に対しても同じことをしたいと思っています! このボタンが VC に存在することをテストしましたが、インターフェイス actionForTargets がありません!

これも試しましたが、うまくいきませんでした:

NSArray *actions = [self.navigationItem.rightBarButtonItem actionsForTarget:self forControlEvent:UIControlEventTouchUpInside];

また

NSArray *actions = [[self.navigationItem.rightBarButtonItem target] actionsForTarget:self forControlEvent:UIControlEventTouchUpInside];

それらのどれも機能しません。ボタンが正しいIBActionに接続されているかどうかを確認するために、UIBarButtonのテストコードを書いた人はいますか?

4

1 に答える 1

0

navigationBar のサブビューをループして、allTargets メソッド全体に rightBarButtonItem が含まれている UIControl を見つけることができます。

それができたら、その UIControl で actionForTarget:forControlEvents: を呼び出すことができます。ここで、rightBarButtonItem がターゲットであり、UIControl の allControlEvents が forControlEvents パラメータです。

//get the underlying control
for(UIControl * control in self.navigationController.navigationBar.subviews)
{
    if([control isKindOfClass:UIControl.class])
    {
        //we found the right one
        if([control.allTargets containsObject:self.navigationItem.rightBarButtonItem])
        {
            NSArray <NSString*> * actions = [control actionsForTarget:self.navigationItem.rightBarButtonItem forControlEvent:[control allControlEvents]];

            //do something with actions.firstObject;

            return;
        }
    }
} 

ただし、 UINavigationBar のサブビューには公に定義されたレイアウトがないため、これは脆弱なソリューションです。

于 2016-03-16T07:28:23.620 に答える