2011-11-22 161 views
8

在我的應用程序中,有許多UIViewControllersUINavigationControllers。在UINavigationBar上必須有一個「後退」按鈕和一個「家」UIButton。所有這些工作正常。導航欄上的自定義後退按鈕

但是我的一些UIViewControllers有很長的名字,有時候還有太小的地方。我想,以取代「後退」按鈕的原標籤(它顯示了一個視圖的標題)與定製的「後退」,但無論我嘗試它不工作:

// Title didn't change 
[self.navigationItem.backBarButtonItem setTitle:@"Back"]; 

// Action didn't set, no response from button (button didn't do anything) 
[self.navigationItem.leftBarButtonItem 
    setAction:self.navigationItem.backBarButtonItem.action]; 

而且我需要的「後退」按鈕,有一個風格像這樣一個問題:Draw custom Back button on iPhone Navigation Bar

+0

在您提及的問題中提供的答案是否不充分? –

+0

它設置(=更改)以前的視圖的標題 – SentineL

+0

可能重複[如何將UINavigationBar後退按鈕的標題更改爲「後退」](http://stackoverflow.com/questions/8046622/how-to-change-the -title-the-uinavigationbar-back-button-to-back) – jrturton

回答

6

試試這個

UIBarButtonItem *backBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)]; 
[self.navigationItem setBackBarButtonItem:backBarBtnItem]; 

- (void)popViewController 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

沒有工作。我可以刪除通常的後退按鈕並添加我自己的,但如何使它的形狀像往常一樣? – SentineL

+0

因爲你需要添加自定義按鈕具有那形狀的圖像我猜... [[UIBarButtonItem alloc] initWithCustomView:customButton]; –

+0

這是一個小野蠻人的代碼,但我想,沒有其他解決方案......所以,讓我們成爲一個野蠻人一段時間:)謝謝你的反應。 – SentineL

50

嘗試以下。這肯定會工作:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:buttonImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
    [customBarItem release]; 
} 

- (void)back { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

確保你有一個導航欄的大小後退按鈕在您的資源文件夾的名稱back.png的按鈕圖像。

如果需要其他幫助,請隨時攜帶。

+0

我發現你可以通過爲高亮顯示的狀態設置圖像來使自定義後退按鈕與股票iOS後退按鈕不區分,如下所示:[button setImage:highlightedButtonImage forState:UIControlStateHighlighted]; –

+0

爲什麼我無法使用此代碼向我的自定義後退按鈕添加標題? '[button setTitle:@「Back」forState:UIControlStateNormal];' – ArVan

+0

導航欄有UIBarButton類型的按鈕。您可以使用自定義內容創建UIBarButton項目或根據需要創建標準系統項目。 –

2

如果你正在做這一切的地方像我,你最好實現Anil的解決方案作爲一個類別:

@interface UIViewController (CustomBackButton) 

- (void) setCustomBackButton; 
- (void) back; 

@end 

@implementation UIViewController (CustomBackButton) 

- (void) setCustomBackButton 
{ 
    UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:buttonImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
} 

- (void) back 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

@end 
1

更簡單地說:

UIBarButtonItem *barBtnItem = 
    [[UIBarButtonItem alloc]initWithTitle:@"Indietro" 
            style:UIBarButtonItemStyleBordered 
           target:self 
           action:@selector(pop)]; 
[barBtnItem setTintColor:[UIColor whiteColor]]; 
self.navigationItem.leftBarButtonItem = barBtnItem; 
7

目標: 將UINavigationBar上的所有後退按鈕自定義爲白色圖標

步驟: 1.在 「didFinishLaunchingWithOptions」 APPDELETE的方法:

的UIImage * backBtnIcon = [UIImage的imageNamed:@ 「navBackBtn」];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { 
    [UINavigationBar appearance].tintColor = [UIColor whiteColor]; 
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon; 
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon; 
}else{ 

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)]; 
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; 
} 

2.in公用超的ViewController類的 「viewDidLoad中」 的方法:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { 
     UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" 
                    style:UIBarButtonItemStylePlain 
                    target:nil 
                    action:nil]; 
     [self.navigationItem setBackBarButtonItem:backItem]; 
    }else{ 
     //do nothing 
    } 
0

假設你有兩個控制器 - 控制器1和控制器2。 Controller2從Controller1被推送。因此,從控制器1按下控制器2上的navigationController現在

Controller2 *controller2 = [[[Controller2 alloc] init]autorelease]; 
self.navigationItem.hidesBackButton = YES; 

,在viewDidLoad中前:方法控制器2中,添加以下代碼片段

UIBarButtonItem *backBarButtonItem =[[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(goBackToAllPets:)]autorelease]; 
self.navigationItem.leftBarButtonItem = backBarButtonItem; 

,並在backButtonClicked方法,您可以執行檢查你想要。