我的应用程序的主页有UIButtons
, btnIncome
和btnExpense
。 光标移动到该按钮按下IncomeVC
和ExpenseVC
respectevely,这是两个UIViewControllers
与UITabBar
经由XIB加入。 使用TabBar有4个项目。 选择在每个标签项目添加相同的四个视图控制器(其含有UITableViews
)作为的子视图IncomeVC
和ExpenseVC
,像例如,DailyVC,WeeklyVC,MonthlyVC,YearlyVC。(即,对于收入,有每日,每周等和相同的用于费用)(我这样做是因为IncomeVC
和ExpenseVC
有一个UIButton
和UIView
是通用于所有选项卡)。
所以问题是,如果单击btnIncome
我必须填充相关的费用收入,反之亦然阵列那些tableviews。 我如何才能从中找到的viewController我选择了不同的标签(我需要从4次我加入IncomeVC和ExpenseVC的子视图得到它)。 我一定要做出8层不同的意见4对每一个收入和支出? 感谢名单。
如果需要访问一个视图控制器的原因是知道得到什么数据,我建议你,而不是给新视图控制器的数据推入堆栈之前。 或者至少足够的数据视图控制器知道如何得到正确的数据,如枚举或常量或东西。
这可以通过自定义初始化,或属性来完成。 看看这个博客帖子中的示例: “视图控制器之间传递数据”
如果您使用的是故事板,你可以使用prepareForSegue:sender
传递正确的数据。 在一个好的教程可以在这里找到: 开始故事板在iOS 5的第2部分
你可以得到以前的viewController像下面的代码,
NSLog(@"%@",[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count-2]);
这将显示前一个的viewController名称...
在斯威夫特3,
if let navController = self.navigationController, navController.viewControllers.count >= 2 {
let viewController = navController.viewControllers[navController.viewControllers.count - 2]
}
在斯威夫特 :
let n: Int! = self.navigationController?.viewControllers?.count
let myUIViewController = self.navigationController?.viewControllers[n-2] as! UIViewController
斯威夫特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
消息要么是在导航堆栈的顶部或根本没有。
UIViewController *previousViewController = [[[self navigationController]viewControllers] objectAtIndex:([viewControllers indexOfObject:self]-1)];
当自我将是当前视图控制器。
迅速
extension UINavigationController {
func getPreviousViewController() -> UIViewController? {
let count = viewControllers.count
guard count > 1 else { return nil }
return viewControllers[count - 2]
}
}
你当然可以重用视图控制器。 我建议,而不是推的UIViewController(其中包含UITabBar从IB添加)按钮被按下的时候,你可以把它的UITabBarController包含4个视图控制器(每日,每周,每月和每年)。
您的UITabBarController可以有一个枚举属性(收入和支出),这可以当你推基于按下按钮此的UITabBarController分配。 从那里,可以分配另一枚举属性(收入和支出)到4个UIViewControllers显示在每个视图控制器的正确类型的数据。
看看这篇文章: 如何在导航堆栈确定一个视图控制器托尼是正确的,你可以从viewControllers阵列,但在指数n-2之前的VC。