2016-06-05 6 views
3
Gepresste

Ich habe die Navigation als:Wie Over Vorherige Ansicht überspringen, wenn Back Button

List of Friends with messages Controller (compose klicken) ->List of friends to select chatting (wählen Freund) ->Show chat with friend

Derzeit wenn innerhalb Show chat with friend und der Benutzer wählt back, es dauert sie zu dem List of friends to select chatting Controller. Ich möchte diesen Controller überspringen und bei der Zurückauswahl zu List of Friends with messages Controller

navigieren. Hinweis: Die List of Friends with messages Controller ist eine eingebettete Registerkarte.

Ich habe versucht mit: self.navigationController?.viewControllers.removeLast(), innerhalb der segue zwischen List of friends to select chatting, um es vom Stapel zu entfernen. Aber dann nach dem Navigieren zu Show chat with friend verschwindet die Zurück-Schaltfläche ...

Wie kann ich die Navigation zulassen, die ich beschreibe?

+0

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

+0

Verwenden Sie Delegaten, Benachrichtigungen, um dies durchzuführen. – iYoung

+0

Ich glaube, die Antwort hier http://stackoverflow.com/questions/18824186/trying-to-handle-back-navigation-button-action-in-ios wird Ihnen helfen. – Axel

Antwort

0

Dies ist ein bisschen schwierig. Wie würde ich dieses Problem Ansatz ist

  • In Show-Chat mit Freund-View-Controller unter viewWillAppear ich einen NSUserDefault genannt pageViewed gesetzt würde und setzen Sie den Wert auf 1

  • Jetzt in Liste der Freunde im Chat zu wählen View Controller unter viewWillAppear Ich würde prüfen, ob der Wert von pageViewed NSUserDefault 1 ist. Wenn es dann wieder auf 0 gesetzt wird, rufe make auf, um es aus dem Stack zu entfernen.

//Remove from Nav-Stack 
[self.navigationController popViewControllerAnimated:YES]; 

Wieder ist es ein wenig schwierig, aber auf jeden Fall machbar.

+1

Use unwindForSegue (unwindSegue: UIStoryboardSegue, in Richtung ViewController: UIViewController) – jjatie

+0

@jjtalie, Ein Abwicklungssege hat einen schöneren Effekt: Sie animieren nicht durch den Zwischencontroller auf dem Weg zum Zielcontroller, jedoch als Soweit ich Ihnen sagen kann, können Sie keinen Abwicklungsabschnitt (oder eine andere Aktion) mit dem Zurück-Knopf einer Navigationsleiste verbinden. Wenn der Bediener die Schaltfläche "Zurück" durch eine benutzerdefinierte Schaltfläche ersetzen oder der Schnittstelle des dritten Controllers eine zusätzliche Schaltfläche hinzufügen möchte, scheint das Abwicklungssegment eine gute und einfache Lösung zu sein. – 7stud

1

Wenn Ihr Ziel ist, Sekunde überspringen UIViewController und pop wieder zu ersten UIViewController von dritten UIViewController. Versuchen Sie, den folgenden Code:

// This count will return how many view controllers are there in navigation stack 
let controllersInNavigationCount = self.navigationController?.viewControllers.count 

// This will pop to first UIViewController skipping second UIViewController 
self.navigationController?.popToViewController(self.navigationController?.viewControllers[controllersInNavigationCount!-2] as! FirstViewController, animated: true) 
0

Xcode 7.2.1
iOS 9.2
Swift 2.1.1
OSX 10.10.5

Die folgenden für mich gearbeitet:

  1. 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: enter image description here 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.