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.
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
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 ...
In Swift 3 ,
if let navController = self.navigationController, navController.viewControllers.count >= 2 {
let viewController = navController.viewControllers[navController.viewControllers.count - 2]
}
In Swift :
let n: Int! = self.navigationController?.viewControllers?.count
let myUIViewController = self.navigationController?.viewControllers[n-2] as! UIViewController
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.
UIViewController *previousViewController = [[[self navigationController]viewControllers] objectAtIndex:([viewControllers indexOfObject:self]-1)];
Wo selbst wird der aktuelle View-Controller.
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)")
}
extension UINavigationController {
func getPreviousViewController() -> UIViewController? {
let count = viewControllers.count
guard count > 1 else { return nil }
return viewControllers[count - 2]
}
}
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.
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.