2014-12-29 8 views
6

Ich habe eine App in iOS 7 und wenn ich zu Xcode 6.1 & iOS 8.1 wechselte meine benutzerdefinierten Zurück-Schaltflächen nicht mehr angezeigt und sie zeigten stattdessen nur die vorherige Ansicht Controller-Titel - das ist die Standardeinstellung.iOS 8 Benutzerdefinierte Zurück-Taste

Ich verwende:

self.navigationItem.backBarButtonItem.title = @""; 
self.navigationItem.backBarButtonItem.tintColor = [UIColor whiteColor]; 

Dies wird nicht mehr funktioniert, stellte ich sicher, die Delegierten zu setzen ... (in .h & .m respectively)

.h

<UINavigationControllerDelegate, UINavigationBarDelegate> 

.m

self.navigationController.delegate = self; 

Ich weiß nicht, ob du das in iOS8 anders machst, ich habe die Boards durchsucht und konnte nur herausfinden, wie man den Zurück-Button versteckt. Ich weiß, dass Sie den Text der hinteren Schaltfläche in der übergeordneten VC festlegen müssen, damit ich mich selbst abdecken kann. Ich habe in beiden VCs identischen Code eingefügt.

Dieser Code funktioniert, damit ich weiß, ich habe eine gewisse Fähigkeit, mit meinem navbar zu kommunizieren, so es ist nicht wie ich ein Problem dort haben ...

self.navigationItem.title = @"New <type>"; 

Dank

+0

Sind Sie versuchen, eine benutzerdefinierte zu machen Zurück-Taste oder ändern Sie einfach den Text der Zurück-Schaltfläche in der Navigationsleiste eines Ihrer View-Controller? – Alex

+0

Ich versuche nur, den Text zu ändern, sorry, ich hätte das deutlicher machen sollen. –

Antwort

7

Manchmal mit barButtonItems Sie brauchen um neue zu machen, anstatt alte zu verändern. Ich habe deinen Code ausprobiert und es hat auch nicht funktioniert. Das funktionierte

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    UIBarButtonItem *item = [[UIBarButtonItem alloc] init]; 
    item.title = @"Title"; 
    self.navigationItem.backBarButtonItem = item; 
} 

EDIT

Dieser Code muss in dem vorherigen View-Controller sein, nicht die Ansicht-Controller, der die Zurück-Taste hat. Ex. Wenn Viewcontroller zu Viewcontroller B A Segue und Sie die Zurück-Taste auf View-Controller-B zu sagen „Backy“ anstelle von Viewcontroller Ein Titel, dann setzen Sie tatsächlich diesen Code in Viewcontroller A, nicht Viewcontroller B

EDIT 2

Um den Titel des Zurück-Buttons des View-Controllers dynamisch zu ändern, ersetzen Sie den BackBtn, bevor Sie einen ViewController drücken, und geben Sie den entsprechenden Titel ein.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let barBtnItem = UIBarButtonItem() 
    navigationItem.backBarButtonItem = barBtnItem 
    if segue.identifier == "seg1" { 
     barBtnItem.title = "Hello 1" 
    } else if segue.identifier == "seg2" { 
     barBtnItem.title = "Hello 2" 
    } 
} 
+0

Entschuldigung für die Verzögerung, ich bin dabei, Ihren Code zu testen. Vielen Dank! –

+0

Versuche, 1 mehr Ruf zu bekommen, damit ich deine Antwort abstimmen kann –

+0

Scheint nicht für mich zu arbeiten. (iOS 8 und 9) –

1

iOS 8+ Schnelle Version (kann ohne großen Aufwand in ObjC konvertiert werden). Diese Methode behält alle Vorteile und das Verhalten der Navigationsleiste auf Standard-Zurück-Taste bezogen (Animation auf Schiebe-/knallen, interaktive Pop Geste, usw.)

// Call the code ONE TIME somewhere on app launch to setup custom back button appearance 
UINavigationBar.appearance().tintColor = UIColor.blackColor() 
// If you need custom positioning for your back button, in this example button will be 1 px up compared to default one 
// Also only vertical positioning works, for horizontal add offsets directly to the image 
let backImageInsets = UIEdgeInsetsMake(0, 0, -1, 0) 
// Get image, change of rendering (so it preserves offsets made in file), applying offsets 
let backImage = UIImage(named: "YourButtonImageAssetFileName")?.imageWithRenderingMode(.AlwaysOriginal).imageWithAlignmentRectInsets(backImageInsets) 
// Setting images 
UINavigationBar.appearance().backIndicatorImage = backImage 
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage 

// Call EACH TIME BEFORE pushing view controller if you don't need title near your back button arrow 
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) 
// Push controller 
self.navigationController?.pushViewController(vc, animated: true) 
3

ich vier Dinge benötigt [Swift]

  • Verwenden Sie meine benutzerdefiniertes Rücktaste Bild
  • Kein Text anzeigen (wie "zurück" oder "letzter Controller-Titel")
  • Systemweit, zaussehen Tasten wie diese
  • DRY alle zurück (nicht selbst wiederholen)

Auch da ich diese viel tun, und es ist so bizarr kompliziert Ich habe es jedes Mal sehen, machte ich eine Kategorie.

in AppDelegate.appDidFinishLaunching .... das nennen:

UINavigationBar.customBackButtonSetup("iconBackArrow", hideText: true) 

diese Erweiterung hinzufügen in einer eigenen Datei, wie UINavigationBar + CustomBackButton:

extension UINavigationBar { 

    // call this once at app start 
    class func customBackButtonSetup(backButtonImageName: String, hideText: Bool) { 
     // Custom back button 
     let insets = UIEdgeInsets(top: 0, left: 0, bottom: -2.5, right: 0) // might have to modify this to perfect vertical alignments 
     let backIndicator = UIImage(named: backButtonImageName)!.imageWithRenderingMode(.AlwaysOriginal).imageWithAlignmentRectInsets(insets) 
     UINavigationBar.appearance().backIndicatorImage = backIndicator; 
     UINavigationBar.appearance().backIndicatorTransitionMaskImage = backIndicator 

     if hideText { 
      let barAppearace = UIBarButtonItem.appearance() 
      barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -100), forBarMetrics:UIBarMetrics.Default) 
     } 

    } 
} 
+0

Danke, funktioniert perfekt! – Thijs