我的应用程序结构如下:
- Window
- Navigation controller
- Table view
- Button (in one of the rows)
- Tab bar controller
- tab..
- tab..
- tab..
(标签栏控制器未添加为子视图,因此无法看到)
如何使按钮能够操作导航控制器和标签栏控制器对象?
答案 0 :(得分:1)
好吧,你可以将它们作为AppDelegate
中的属性,如下所示:
@property (nonatomic, retain) UINavigationController *navigationController;
@property (nonatomic, retain) UITabBarController *tabBarController;
而且在你的表视图中你可以得到一个指向它们的指针:
UINavigationController *navigationController = [(YourAppDelegateClass *)[[UIApplication sharedApplication] delegate] navigationController];
UITabBarController *tabBarController = [(YourAppDelegateClass *)[[UIApplication sharedApplication] delegate] tabBarController];
在此之后,您可以让按钮按照您的要求进行操作。如果这对您有用,请告诉我。
答案 1 :(得分:0)
您的描述不准确。 UITabbarController
和UINavigationController
都是多个视图控制器的控制器。因此,在您的结构中,您应该在“导航控制器”和“表视图”之间添加UITableViewController
。
根据Apple的适用于iOS的View Controller编程指南,您可以将两个视图控制器或标签栏控制器分配给要由标签栏控制器控制的项目。
因此,您可以拥有以下结构:
- Window
- Tabbar Controller
-Navigation Controller
- Table View Controller
- Table view
- Button
- tab (another View Controller)
- tab
- etc.
当表格视图可见时,您可以隐藏UITabbar
。
然后,您可以按照预期的方式访问所有内容:UITableViewController
可以使用self.navigationController
或self.tabbarController
。
答案 2 :(得分:0)
鉴于您想要做什么的描述:
此时导航控制器正在显示(其登录屏幕)。我想隐藏它并将标签栏控制器添加为子视图
我认为您并不需要按钮具有对导航控制器和标签栏的引用。
您可以在应用委托中定义一个可以直接从按钮访问的方法,如下所示:
[[(MyAppDelegate*)[[UIApplication sharedApplication].delegate] doSwapNavAndTabBar];
app委托是最自然的一点,因为它对你想要进行交换的window
对象负有“责任”。
如果要显示的标签栏在某种程度上取决于按钮,那么我建议将按钮引用作为参数传递给该方法:
[[(MyAppDelegate*)[[UIApplication sharedApplication].delegate] doSwapNavAndTabBar:button];
通常用于管理通过控件生成的事件。然后,应用程序代表可以向按钮询问所需的信息,以确定要显示的标签栏或如何初始化它。