2010-07-08 3 views
5

Ich möchte die Standard-Zurück-Taste des NavigationscontrollerKönnen wir den Navigationscontroller von leftBarButtonItem deaktivieren, der die Schaltfläche Zurück des View-Controllers im iPhone ist?

self.navigationItem.rightBarButtonItem.enabled = NO; 
// Below code does not work since leftBarButtonItem is always nil. 
self.navigationItem.leftBarButtonItem.enabled = NO; 

ich es deaktiviert getan haben mit manuell unten gezeigt, aber gibt es eine Eigenschaft deaktiviert die Standard-Zurück-Taste mit nur einzelnen Zeile?

backButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 5, 100, 30)]; 
[backButton setBackgroundImage:[UIImage imageNamed:@"backbutton_100.png"] forState:UIControlStateNormal]; 
[backButton addTarget:self action:@selector(backAction:) forControlEvents:UIControlEventTouchUpInside]; 
[backButton setTitle:@" All Customers" forState:UIControlStateNormal]; 
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:12]; 
[buttonView addSubview:backButton]; 

UIBarButtonItem* leftButton = [[UIBarButtonItem alloc] initWithCustomView:buttonView]; 
self.navigationItem.leftBarButtonItem = leftButton; 
[leftButton release]; 

// Now it is working. 
self.navigationItem.leftBarButtonItem.enabled = NO; 
+0

Die Zurück-Schaltfläche ist die Linke. Warum versuchen Sie, RightBarButtonItem.enabled auf NO zu setzen? Sollte es nicht übrig sein? Bitte aktualisieren Sie Ihre Frage und versuchen Sie, Ihren Code korrekt anzuzeigen. Verwenden Sie 4 Leerzeichen ("") in jeder Zeile, um sie nach rechts auszurichten. Wir sind hier um zu helfen, nicht zu entschlüsseln ;-) – Kalle

Antwort

5

Die Verwendung von "hidesBackButton = YES" ist wirklich keine elegante Lösung, denn es VERSTECKT die Schaltfläche, die nicht das ist, was wir wollen. Ein akzeptabler Work-Around wäre das Hinzufügen eines UILabels zum Fenster über der Zurück-Schaltfläche, um zumindest die Berührungen auf der Schaltfläche zu deaktivieren.

Fügen Sie diese Methode, um Ihre AppDelegate Klasse:

- (void) disableLeftBarButtonItemOnNavbar:(BOOL)disable 
{ 
    static UILabel *l = nil; 

    if (disable) { 
     if (l != nil) 
      return; 
     l = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 160, 44)]; 
     l.backgroundColor = [UIColor clearColor]; 
     l.userInteractionEnabled = YES; 
     [self.window addSubview:l]; 
    } 
    else { 
     if (l == nil) 
      return; 
     [l removeFromSuperview]; 
     [l release]; 
     l = nil; 
    } 
} 

Sie können es wie folgt aus jedem View-Controller aufrufen deaktivieren:

MyAppDelegate *appDeleg = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[appDeleg disableLeftBarButtonItemOnNavbar:YES]; 

aktivieren:

MyAppDelegate *appDeleg = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[appDeleg disableLeftBarButtonItemOnNavbar:NO]; 
+1

Danke für Ihre Antwort –

+0

Gern geschehen. –

+0

Es gibt einen Fehler mit dem Code und einem rotierenden Gerät, Sie müssten eine affine Transformation durchführen, damit sie in anderen Orientierungen richtig funktioniert. – Heckman

2

Anruf [self.navigationItem setHidesBackButton:YES]; für den View-Controller Sie nicht wollen, die Zurück-Taste haben. Stellen Sie dann die leftBarButtonItem normal ein.

+0

Ich bin froh, dass ich helfen konnte. – jrtc27

+1

Ich möchte die Schaltfläche deaktivieren die Schaltfläche nicht versteckt, danke für Ihre Antwort –

+0

Warum nicht eine Instanz von UIBarButtonItem erstellen, legen Sie es auf die linkeBarButtonItem, ausblenden Sie die BackButton, und legen Sie die leftBarButtonItem auf Ihre Schaltfläche. Deaktivieren Sie dann das leftBarButtonItem. – jrtc27

11

Seine sehr einfach ..... versuchen Sie es einfach

+2

Es scheint nicht deaktiviert (mit dunkelgrauem Text), aber es funktioniert und ist besser als die Schaltfläche zu verbergen. +1 –

+0

Es funktioniert für mich, danke – derpoliuk

1

Sie können auch

[[_navigationController.topViewController.navigationItem leftBarButtonItem] setEnabled:NO]; // The top view controller on the stack. 
[[_navigationController.visibleViewController.navigationItem leftBarButtonItem] setEnabled:NO];// Return modal view controller if it exists. Otherwise the top view controller. 

verwenden Sie diese verwenden können, wenn Sie UIViewControler von AppDelegate oder jede andere viewcontroler deaktivieren möchten oder aktivieren.