没有进入函数-navigationController:willShowViewController:animated:

时间:2011-12-14 15:15:38

标签: iphone objective-c ios delegates navigationcontroller

我一直在努力解决这个问题。我一直试图在几个视图中持续RightBarButtonItem。通过研究几个博客和网络搜索,我发现我需要在函数rightBarButtonItem中设置-navigationController:willShowViewController:animated:

我的应用程序没有显示任何错误,但是当我尝试调试或使用NSLog语句时,它显示该应用程序根本不会进入此功能。我在<UINavigationControllerDelegate>类的界面中有RootViewController,但我也将NSXMLParser解析器设置为另一个类中的自身([parser setDelegate:self];)的委托。这可能是navigationController代表无法识别的问题。

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
     //[self.navigationController.navigationItem setRightBarButtonItem:twoButtons animated:YES];
     self.navigationItem.rightBarButtonItem = twoButtons;

     NSLog(@"We are in navigationController delegate function");
}

1 个答案:

答案 0 :(得分:4)

如果您希望多个视图具有相同的rightBarButtonItem,为什么不创建所有视图都继承的基本UIViewController?从概念上讲,我认为这是一个更好的解决方案,因为不仅所有视图都会继承按钮,它们也会获得行为;)这也允许您在一个视图需要时覆盖基本控制器中的方法以稍微不同的方式处理点击。

@interface BaseViewController : UIViewController

@property (nonatomic, retain) YourApplicationDelegate *delegate;

- (void) setupButtons;

- (void) buttonClicked:(id)sender;

@end

#import "BaseViewController.h"

@implementation BaseViewController

@synthesize delegate=_delegate;

- (void) viewDidLoad {

    [super viewDidLoad];

    self.delegate = (YourApplicationDelegate *) [[UIApplication sharedApplication] delegate];

    [self setupButtons];
}

- (void) setupButtons {
    UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave 
                                                                        target:self 
                                                                        action:@selector(buttonClicked:)];

    self.navigationItem.rightBarButtonItem = button;

    [button release];    
}

- (void) buttonClicked:(id)sender {
    NSLog(@"Click!");
}

- (void) dealloc {
    [_delegate release];
    [super dealloc];
}

@end

/* Now the rest of your view controllers look pretty clean and you don't have a lot of
   code in your delegate method.  Most problems can be solved with a layer or two of abstraction :)  */

@interface MyViewController : BaseViewController

@end

Base ViewControllers也是一个注入应用程序委托的好地方,你需要很多。这就是为什么我把它包含在代码块中,即使它不是你问题的一部分。如果您想使用按钮的共享实例或委托响应处理程序,那么您可以轻松地将该代码放入您的委托中,并利用基本视图轻松访问它。