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];

它们都不起作用。任何人都为 UIBarButton 编写了测试代码来检查按钮是否连接到正确的 IBAction?

4

1 回答 1

0

可以循环遍历navigationBar的子视图,找到一个UIControl整个allTargets方法包含rightBarButtonItem。

一旦你有了它,你可以在那个 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 回答