Mid*_*das 35 iphone uitabbarcontroller uiviewcontroller uinavigationcontroller
我的应用程序的主页有UIButtons,btnIncome和btnExpense.光标移动到该按钮按下IncomeVC和ExpenseVCrespectevely,这是两个UIViewControllers与UITabBar经由XIB加入.tabBar有4个项目.选择在每个标签项目添加相同的四个视图控制器(包含UITableViews)作为的子视图IncomeVC和ExpenseVC,像例如,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名称...
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
(基于以前的答案但更简单)
extension UINavigationController {
var previousViewController: UIViewController? {
viewControllers.count > 1 ? viewControllers[viewControllers.count - 2] : nil
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要访问前一个视图控制器的原因是要知道要获取哪些数据,我建议您在将新数据推送到堆栈之前为新视图控制器提供数据.或至少足够的数据,以便视图控制器知道如何获得正确的数据,例如枚举或常数或其他东西.
这可以使用自定义初始化程序或属性来完成.看看这篇博客文章的一个例子:"在视图控制器之间传递数据"
如果您使用的是故事板,则可以使用prepareForSegue:sender传递正确的数据.关于它的一个很好的教程可以在这里找到:iOS 5中的Beginning Storyboard第2部分
斯威夫特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消息的视图控制器将位于导航堆栈的顶部或根本不存在.
UIViewController *previousViewController = [[[self navigationController]viewControllers] objectAtIndex:([viewControllers indexOfObject:self]-1)];
Run Code Online (Sandbox Code Playgroud)
其中 self 将是当前视图控制器。
| 归档时间: |
|
| 查看次数: |
48104 次 |
| 最近记录: |