我正在使用iOS 5和Storyboard。我的UITabBar
是使用Interface Builder创建的。我的TabBar
中有两个相似的项目,它们是相同的列表,只有不同类型的项目。我所做的,但看起来很奇怪,是为每个UITableView
和viewDidLoad
设置了不同的“标记”,然后根据标记指定了正确的类型。
- (void)viewDidLoad
{
[super viewDidLoad];
if (self.tableView.tag == 1)
{
type = @"lent";
}
else if (self.tableView.tag == 2)
{
type = @"borrowed";
}
}
有更好的方法吗?我没有在代码中创建UITabBar
,所以我的AppDelegate
非常空!我设置的类型只是我的一个核心数据实体中的一个属性,在列表中我有借用项目,另一个我有借阅项目,但它们是同一个实体。
答案 0 :(得分:3)
您可以在公共视图控制器上将该类型公开为属性,并在选择相关标签栏项时设置它(来自UITabBarControllerDelegate协议的tabBarController:didSelectViewController:
- 您的应用程序委托将是标签栏控制器委托) 。
您可以按照以下方式进行设置。声明您的app委托符合UITabBarControllerDelegate协议,然后将其设置为标签栏控制器的委托(您必须在代码中执行此操作,因为应用程序委托无法连接到故事板中)。在applicationDidFinishLaunching中,在返回YES之前添加以下内容:
UITabBarController *tbc = (UITabBarController*)self.window.rootViewController;
tbc.delegate = self;
然后实现以下委托方法:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
switch (tabBarController.tabBar.selectedItem.tag)
{
case 1:
viewController.property = @"propertyA";
break;
case 2:
viewController.property = @"propertyB";
break;
}
NSLog(@"view controller is %@",viewController);
}
您需要将viewController变量强制转换为实际的视图控制器类,并将相关标记分配给每个视图控制器的标签栏项。
答案 1 :(得分:1)
你在那里应该工作得很好。另一种选择是拥有一个具有所有功能的公共UIViewController超类,然后将该类子类化为子类,并提供设置适当类型的viewDidLoad实现。然后在Interface Builder中,您可以将UITabBar视图控制器设置为适当的子类型。
结果会是相同的,但在IB中可能会更清楚一些事情,因为您不必依赖于记住每个数字标记的含义。