2011-12-14 62 views
1

我一直在努力解決這個問題一些日子。我一直試圖在幾個視圖中持續使用RightBarButtonItem。通過研究多個博客和網絡搜索,結果證明我需要在函數-navigationController:willShowViewController:animated:中設置我的rightBarButtonItem未進入功能-navigationController:willShowViewController:animated:

我的應用程序沒有顯示任何錯誤,但是當我嘗試調試或使用NSLog語句時,它顯示應用程序根本不會輸入此功能。我在我的RootViewController類的接口中有<UINavigationControllerDelegate>,但是我還將我的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"); 
} 
+0

您能否將代碼粘貼到您設置`navigationController`的代表處? – dasblinkenlight 2011-12-14 15:21:20

+0

也許這不是一種寫入方式來設置它,但這是我做的:[self.navigationController setDelegate:self];在這種情況下,navigationController會輸入函數navigationController:willShowViewController:animated:但它不會將我的rightBarButtonItem設置爲任何視圖。 – Lily 2011-12-14 15:33:41

回答

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 

基本ViewControllers也是一個很好的地方注入你需要很多的應用程序委託。這就是爲什麼我將它包含在代碼塊中,即使它不是你問題的一部分。如果您想使用按鈕的共享實例或將響應處理程序委託出去,那麼您可以輕鬆地將該代碼放入委託中,並利用基本視圖輕鬆訪問它。