如何从UIBarButtonItem获取对包含navigationController的引用?

时间:2013-10-26 03:22:40

标签: objective-c uinavigationcontroller uibarbuttonitem

我在 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.//..
}

2 个答案:

答案 0 :(得分:2)

假设此方法位于导航控制器中的视图控制器中,您只需执行以下操作:

UINavigationController *navigationController = self.navigationController;

问题 - 为什么你的按钮处理程序是一个类方法?只有在使按钮处理程序成为正确的实例方法时,此解决方案才有效。

如果您真的需要将目标作为类方法,则可以从按钮的target属性获取对视图控制器的引用:

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

更新

基于以下事实:在这种情况下,按钮的目标不是视图控制器,此解决方案不起作用。

答案 1 :(得分:0)

我是否正确理解您是将它作为一种类方法,因为它用于来自不同视图控制器的各种按钮?

如果是这样,解决方法是让每个按钮向其自己的UIViewController中的方法发送目标/操作消息,然后让该方法调用公共类方法,将UINavigationController作为参数传递。

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

您显然需要重新编写类方法以接受其他参数:

    + (void)buttonPressed:(UIBarButtonItem *)barButtonItem 
      fromNavigationcontroller:(UINavigationController *)navController{