it-swarm.com.de

Wie bekomme ich den vorherigen Viewcontroller, der meine aktuelle Ansicht verschoben hat?

Die Startseite meiner App hat UIButtons, btnIncome und btnExpense. Durch Drücken auf diese Schaltflächen werden IncomeVC und ExpenseVC gedrückt. Dies sind zwei UIViewControllers, wobei UITabBar über xib hinzugefügt wird. Die TabBar hat 4 Elemente. Wenn Sie auf jeder Registerkarte einen Eintrag auswählen, werden dieselben vier Ansichts-Controller (die UITableViews enthalten) als Unteransicht von IncomeVC und ExpenseVC hinzugefügt, wie z. B. DailyVC, WeeklyVC, MonthlyVC, YearlyVC Expense) (Ich habe das so gemacht, weil IncomeVC und ExpenseVC eine UIButton und eine UIView haben, die für alle Registerkarten üblich sind). 

Das Problem ist also, dass, wenn Sie auf die Variable btnIncome klicken, ich diese Tabellenansichten mit den Arrays für Income und umgekehrt für Expense füllen muss. Wie finde ich, von welchem ​​viewController ich die verschiedenen Registerkarten ausgewählt habe (ich muss es aus den 4 Ansichten erhalten, die ich als Untersicht von IncomeVC und ExpenseVC hinzugefügt habe)? Muss ich jeweils 8 verschiedene Ansichten 4 für Einnahmen und Ausgaben erstellen? Danke.

32
Midas

Wenn der Grund für den Zugriff auf den vorherigen View-Controller darin besteht, zu wissen, welche Daten abgerufen werden sollen, würde ich vorschlagen, dass Sie stattdessen dem neuen View-Controller die Daten geben, bevor Sie ihn in den Stapel schieben. Oder zumindest so viele Daten, dass der View-Controller weiß, wie er die richtigen Daten erhält, z. eine enum oder Konstante oder etwas. 

Dies kann mit einem benutzerdefinierten Initialisierer oder mit einer Eigenschaft geschehen. Sehen Sie sich diesen Blogeintrag an, um ein Beispiel zu erhalten: "Daten zwischen Ansichtssteuerungen übergeben"

Wenn Sie ein Storyboard verwenden, können Sie prepareForSegue:sender verwenden, um die richtigen Daten zu übergeben. Eine gute Anleitung dazu finden Sie hier: Beginn der Storyboards in iOS 5 Part 2

7
Vegar

Sie können den vorherigen viewController wie folgt erhalten,

NSLog(@"%@",[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count-2]);

Dies zeigt den vorherigen viewController-Namen an ...

35
Venk

In Swift 3 ,

if let navController = self.navigationController, navController.viewControllers.count >= 2 {
     let viewController = navController.viewControllers[navController.viewControllers.count - 2]
}
25
Venk

In Swift :

let n: Int! = self.navigationController?.viewControllers?.count
let myUIViewController = self.navigationController?.viewControllers[n-2] as! UIViewController
20
King-Wizard

Swift 3

Hier ist ein Mashup der vorherigen Antworten, die in eine Erweiterung eingefügt werden können:

extension UIViewController{
   var previousViewController:UIViewController?{
        if let controllersOnNavStack = self.navigationController?.viewControllers, controllersOnNavStack.count >= 2 {
            let n = controllersOnNavStack.count
            return controllersOnNavStack[n - 2]
        }
        return nil
    }
}

Bearbeiten:

Wenn Sie die previousViewController eines bestimmten View-Controllers abrufen, nennen Sie sie VC1. In viewWillDisappear wird VC1 bereits vom Navigationscontroller-Stack abgehängt. In diesem Szenario ruft der obige Code also nicht den View-Controller direkt über VC1 ab (nennen Sie ihn VC2), sondern den View-Controller über VC2 (sofern vorhanden).

Um dieses Problem zu vermeiden, überprüfe ich nur, ob VC1 noch auf dem Stack ist, wenn previousViewController angefordert wird. Hier ist der aktualisierte Code:

extension UIViewController{
    var previousViewController:UIViewController?{
        if let controllersOnNavStack = self.navigationController?.viewControllers{
            let n = controllersOnNavStack.count
            //if self is still on Navigation stack
            if controllersOnNavStack.last === self, n > 1{
                return controllersOnNavStack[n - 2]
            }else if n > 0{
                return controllersOnNavStack[n - 1]
            }
        }
        return nil
    }
}

Bei diesem Code wird davon ausgegangen, dass der View Controller, an den Sie die previousViewController-Nachricht senden, entweder oben im Navigationsstapel oder gar nicht angezeigt wird.

7
J.beenie
UIViewController *previousViewController = [[[self navigationController]viewControllers] objectAtIndex:([viewControllers indexOfObject:self]-1)];

Wo selbst wird der aktuelle View-Controller.

4
Zaraki

Swift 4.1, 4.2

 let allPreviousViewC = currentViewController.navigationController?.viewControllers // will give array of all pushed VC
// Can use if condition to check array count and then put below code inside that condition
    for viewC in allPreviousViewC! {
           print("ViewC is \(viewC)")
      }
1
GSK

Schnell

extension UINavigationController {
    func getPreviousViewController() -> UIViewController? {
        let count = viewControllers.count
        guard count > 1 else { return nil }
        return viewControllers[count - 2]
    }
}
1
dimpiax

Schauen Sie sich diesen Beitrag an: So identifizieren Sie den vorherigen View-Controller im Navigations-Stack Tony hat Recht, Sie können den vorherigen VC aus dem viewControllers-Array erhalten, jedoch am Index n-2.

0
CharlieReed

Sie können die View-Controller sicherlich wiederverwenden. Ich würde vorschlagen, anstatt UIViewController (der UITabBar enthält, der von IB hinzugefügt wurde) zu drücken, wenn Sie die Taste drücken, können Sie UITabBarController drücken, der 4 View-Controller (täglich, wöchentlich, monatlich und jährlich) enthält. 

Ihr UITabBarController verfügt möglicherweise über eine Enumeneigenschaft (Income and Expense), die zugewiesen werden kann, wenn Sie diesen UITabBarController basierend auf der gedrückten Schaltfläche drücken. Von dort aus können Sie den 4 UIViewControllers eine andere Enumeneigenschaft (Income and Expense) zuweisen, um den korrekten Datentyp in jedem Ansichtscontroller anzuzeigen.

0
Valent Richie