如何获取推送当前视图的上一个viewcontroller

Mid*_*das 35 iphone uitabbarcontroller uiviewcontroller uinavigationcontroller

我的应用程序的主页有UIButtons,btnIncomebtnExpense.光标移动到该按钮按下IncomeVCExpenseVCrespectevely,这是两个UIViewControllersUITabBar经由XIB加入.tabBar有4个项目.选择在每个标签项目添加相同的四个视图控制器(包含UITableViews)作为的子视图IncomeVCExpenseVC,像例如,DailyVC,WeeklyVC,MonthlyVC,YearlyVC.(即,对于收入,有每天,每周等和相同的用于费用)(我已经这样做了,因为IncomeVC并且ExpenseVCa UIButton和a UIView对于所有选项卡都是通用的).

所以问题是,如果点击btnIncome我必须使用与收入相关的数组填充这些表视图,反之亦然.如何从哪个viewController中找到我选择的不同选项卡(我需要从我添加的4个视图中获取它作为IncomeVC和ExpenseVC的子视图).我是否必须为收入和费用制作8个不同的视图4?感谢名单.

Ven*_*enk 35

您可以像以下代码一样获取上一个viewController,

NSLog(@"%@",[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count-2]);
Run Code Online (Sandbox Code Playgroud)

这将显示以前的viewController名称...

  • @Erik计数属性总是比索引大1,所以要在当前的UIViewController之前获取UIViewController,你必须从计数中减去2 (2认同)

Ven*_*enk 32

Swift 3中,

if let navController = self.navigationController, navController.viewControllers.count >= 2 {
     let viewController = navController.viewControllers[navController.viewControllers.count - 2]
}
Run Code Online (Sandbox Code Playgroud)


Kin*_*ard 20

Swift中:

let n: Int! = self.navigationController?.viewControllers?.count
let myUIViewController = self.navigationController?.viewControllers[n-2] as! UIViewController
Run Code Online (Sandbox Code Playgroud)


eon*_*ist 10

斯威夫特 5.1

(基于以前的答案但更简单)

extension UINavigationController {
    var previousViewController: UIViewController? {
       viewControllers.count > 1 ? viewControllers[viewControllers.count - 2] : nil
    }
}
Run Code Online (Sandbox Code Playgroud)


Veg*_*gar 9

如果需要访问前一个视图控制器的原因是要知道要获取哪些数据,我建议您在将新数据推送到堆栈之前为新视图控制器提供数据.或至少足够的数据,以便视图控制器知道如何获得正确的数据,例如枚举或常数或其他东西.

这可以使用自定义初始化程序或属性来完成.看看这篇博客文章的一个例子:"在视图控制器之间传递数据"

如果您使用的是故事板,则可以使用prepareForSegue:sender传递正确的数据.关于它的一个很好的教程可以在这里找到:iOS 5中的Beginning Storyboard第2部分


J.b*_*nie 9

斯威夫特3

以下是可以放入扩展程序的先前答案的mashup:

extension UIViewController{
   var previousViewController:UIViewController?{
        if let controllersOnNavStack = self.navigationController?.viewControllers, controllersOnNavStack.count >= 2 {
            let n = controllersOnNavStack.count
            return controllersOnNavStack[n - 2]
        }
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

在获取previousViewController给定视图控制器时,将其称为VC1,in viewWillDisappear,VC1已经弹出导航控制器堆栈.因此,在这种情况下,上面的代码最终不会直接在VC1上方(称为VC2)获取View控制器,而是在VC2上方(如果存在)获取视图控制器.

为了避免这个问题,我只是在previousViewController请求时检查VC1是否仍在堆栈中.这是更新的代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码假定您发送previousViewController消息的视图控制器将位于导航堆栈的顶部或根本不存在.


Zar*_*aki 5

UIViewController *previousViewController = [[[self navigationController]viewControllers] objectAtIndex:([viewControllers indexOfObject:self]-1)];
Run Code Online (Sandbox Code Playgroud)

其中 self 将是当前视图控制器。