如何获得先前的ViewController是把我的当前视图(How to get the previ

2019-09-04 01:08发布

我的应用程序的主页有UIButtonsbtnIncomebtnExpense 。 光标移动到该按钮按下IncomeVCExpenseVC respectevely,这是两个UIViewControllersUITabBar经由XIB加入。 使用TabBar有4个项目。 选择在每个标签项目添加相同的四个视图控制器(其含有UITableViews )作为的子视图IncomeVCExpenseVC ,像例如,DailyVC,WeeklyVC,MonthlyVC,YearlyVC。(即,对于收入,有每日,每周等和相同的用于费用)(我这样做是因为IncomeVCExpenseVC有一个UIButtonUIView是通用于所有选项卡)。

所以问题是,如果单击btnIncome我必须填充相关的费用收入,反之亦然阵列那些tableviews。 我如何才能从中找到的viewController我选择了不同的标签(我需要从4次我加入IncomeVC和ExpenseVC的子视图得到它)。 我一定要做出8层不同的意见4对每一个收入和支出? 感谢名单。

Answer 1:

如果需要访问一个视图控制器的原因是知道得到什么数据,我建议你,而不是给新视图控制器的数据推入堆栈之前。 或者至少足够的数据视图控制器知道如何得到正确的数据,如枚举或常量或东西。

这可以通过自定义初始化,或属性来完成。 看看这个博客帖子中的示例: “视图控制器之间传递数据”

如果您使用的是故事板,你可以使用prepareForSegue:sender传递正确的数据。 在一个好的教程可以在这里找到: 开始故事板在iOS 5的第2部分



Answer 2:

你可以得到以前的viewController像下面的代码,

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

这将显示前一个的viewController名称...



Answer 3:

斯威夫特3,

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


Answer 4:

斯威夫特

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


Answer 5:

斯威夫特3

这里是一个可以放入扩展以前的答案的混搭:

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

编辑:

当获取的previousViewController一个给定的视图控制器,称之为VC1,在viewWillDisappear ,VC1已经弹出导航控制器堆栈。 因此,在这种情况下,上面的代码并没有结束上述VC1直接获取视图控制器(称之为VC2),但高于VC2视图控制器(如果存在的话)。

为了避免这个问题,我只是检查是否VC1仍然在栈上时previousViewController请求。 以下是更新后的代码:

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
    }
}

此代码假定要发送的该视图控制器previousViewController消息要么是在导航堆栈的顶部或根本没有。



Answer 6:

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

当自我将是当前视图控制器。



Answer 7:

迅速

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


Answer 8:

你当然可以重用视图控制器。 我建议,而不是推的UIViewController(其中包含UITabBar从IB添加)按钮被按下的时候,你可以把它的UITabBarController包含4个视图控制器(每日,每周,每月和每年)。

您的UITabBarController可以有一个枚举属性(收入和支出),这可以当你推基于按下按钮此的UITabBarController分配。 从那里,可以分配另一枚举属性(收入和支出)到4个UIViewControllers显示在每个视图控制器的正确类型的数据。



Answer 9:

看看这篇文章: 如何在导航堆栈确定一个视图控制器托尼是正确的,你可以从viewControllers阵列,但在指数n-2之前的VC。



文章来源: How to get the previous viewcontroller that pushed my current view