Xcode 7.2.1
iOS 9.2
Swift 2.1.1
OSX 10.10.5
Die folgenden für mich gearbeitet:
Sie kann navigationController?.popViewControllerAnimated(true)
in einer Schleife verwenden, um so viele View-Controller zu überspringen, wie Sie möchten. Wenn der ViewController, zu dem Sie zurückkehren möchten, der erste ViewController im UINavigationController-Stack ist, können Sie navigationController?.popToRootViewControllerAnimated(true)
verwenden, um zum ersten View-Controller zurückzukehren.
Die App animiert noch durch die übersprungenen Viewcontroller, so dass Sie sehen den übersprungenen Ansicht Schlitten durch auf dem Weg zum Ziel Viewcontroller.
ich verwendet haben versucht: self.navigationController .viewControllers.removeLast() innerhalb des segue zwischen der Liste der Freunde im Chat, um es auszuwählen aus dem Stapel zu entfernen. Aber dann nach dem navigierenden Chat mit Freund zu zeigen, die Zurück-Taste verschwindet ...
Hmmm ... das scheint, wie es funktionieren soll. Die Informationen zur Zurück-Schaltfläche werden von der vorherigen ViewController-Eigenschaft navigationItem
abgerufen. Der vorherige ViewController navigationItem.backBarButtonItem
enthält die Informationen für die Schaltfläche Zurück, die Sie sehen. Also, wenn Sie diesen ViewController aus dem Stapel entfernt haben, warum hat der UINavigationController die navigationItem.backBarButtonItem
Information von einem früheren ViewController nicht abgerufen?
Es klingt, als hätte der Ziel-ViewController bereits einen schwachen Verweis auf den vorherigen ViewController erhalten - den, den Sie aus dem Stack entfernt haben. Wenn Sie dann den vorherigen ViewController aus dem ViewControllers-Array entfernten, verschwand der vorherige ViewController, und der schwache Verweis wurde mit nil versehen - was verhinderte, dass der Ziel-ViewController die Informationen für die Zurück-Schaltfläche erhielt. daher wurde keine Zurück-Schaltfläche angezeigt.
AppDelegate.swift:
//
// AppDelegate.swift
// NavigationBarExample
//
// Copyright © 2016 7stud. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let navController = window!.rootViewController as! UINavigationController
let friendsController = navController.topViewController as! FriendsTableViewController
friendsController.friendStore = FriendStore(names: ["Joe", "Cathy", "Bobo"])
return true
}
...
...
FriendsTableViewController.swift:
// FriendsTableViewController.swift
// NavigationBarExample
//
//
// Copyright © 2016 7stud. All rights reserved.
//
import UIKit
class FriendsTableViewController: UITableViewController {
var friendStore: FriendStore!
override func viewDidLoad() {
super.viewDidLoad()
//Prevent TableView from underlapping the status bar:
let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height
let insets = UIEdgeInsets(
top: statusBarHeight, left: 0, bottom: 0, right: 0
)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets
}
//MARK: - UITableViewDataSource methods:
override func tableView(tableView: UITableView,
numberOfRowsInSection section: Int)
-> Int
{
return friendStore.allFriends.count
}
override func tableView(tableView: UITableView,
cellForRowAtIndexPath
indexPath: NSIndexPath)
-> UITableViewCell
{
let friend = friendStore.allFriends[indexPath.row]
let cell = tableView.dequeueReusableCellWithIdentifier(
"UITableViewCell-Default",
forIndexPath: indexPath
)
cell.textLabel?.text = friend.name
return cell
}
//MARK: - Segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ShowFriend" {
if let row = tableView.indexPathForSelectedRow?.row {
let viewController2 = segue.destinationViewController as! ViewController2
viewController2.friend = friendStore.allFriends[row]
viewController2.previousTitle = navigationItem.title
}
}
}
}
FriendStore.swift:
//
// FriendStore.swift
// NavigationBarExample
//
// Copyright © 2016 7stud. All rights reserved.
//
import Foundation
class FriendStore {
var allFriends: [Friend] = []
init(names: [String]) {
for name in names {
allFriends.append(Friend(name: name))
}
}
}
Friend.swift:
//
// Friend.swift
// NavigationBarExample
//
// Copyright © 2016 7stud. All rights reserved.
//
import Foundation
class Friend: NSObject {
var name: String
init(name: String) {
self.name = name
super.init()
}
}
ViewController2.swift:
//
// ViewController2.swift
// NavigationBarExample
//
// Copyright © 2016 7stud. All rights reserved.
//
import UIKit
class ViewController2: UIViewController {
var friend: Friend! {
didSet {
navigationItem.title = friend.name
}
}
var previousTitle: String!
override func viewDidLoad() {
//Set the correct title for the back button on the next view controller:
let myBackButtonItem = UIBarButtonItem(
title: previousTitle,
style: .Plain,
target: nil,
action: nil //An action specified here won't get called--I
//think the NavigationController must overwrite this sometime later.
)
navigationItem.backBarButtonItem = myBackButtonItem
}
}
ViewController3.swift:
//
// ViewController3.swift
// NavigationBarExample
//
// Copyright © 2016 7stud. All rights reserved.
//
import UIKit
class ViewController3: UIViewController {
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
let goBackCount = 2
if let navController = navigationController {
let viewControllers = navController.viewControllers
if viewControllers.count >= goBackCount {
for _ in 1...goBackCount {
navController.popViewControllerAnimated(true)
}
}
}
}
}
Eine weniger allgemeine Art und Weise die gleiche Sache zu tun ist : Wenn der Controller, zu dem Sie zurückkehren möchten, der ist root Viewcontroller, dh es ist der erste Controller in dem UINavigationController-Stapel ist, dann in viewWillDisappear()
Sie einfach navigationController?.popToRootViewControllerAnimated(true)
Main.storyboard anrufen: Nachdem ich die Table View
im Storyboard erstellt, wählte ich die Table View
und in dem Xcode-Menü Bar, wählte ich Editor>Embed In>NavigationController
. Die Navigation Controller
ist die initial view controller
. Ich habe auch doppelt auf die Mitte der Navigationsleiste in der Table View
geklickt und den Titel auf Friends
gesetzt.
Dann steuere ich + gezogen von Prototype Cell
in Table View
zu View Controller2
; Aus dem Popup wählte ich Selection Segue->Show
.
Dann steuere ich + gezogen von der Schaltfläche in View Controller2
zu View Controller3
; Aus dem Popup wählte ich Action Segue->Show
.
Sie haben die richtige Idee, aber ich würde vorschlagen, dass Sie das Array 'self.navigationController? .viewControllers' im' viewWillAppear' modifizieren, das Ihren 'show chat with friend' View Controller unterstützt. Beachten Sie, dass Sie in dieser Instanz nicht einfach 'removeLast' verwenden können. Sie müssen das Element "count-2" entfernen – Paulw11
Verwenden Sie Delegaten, Benachrichtigungen, um dies durchzuführen. – iYoung
Ich glaube, die Antwort hier http://stackoverflow.com/questions/18824186/trying-to-handle-back-navigation-button-action-in-ios wird Ihnen helfen. – Axel