我正在使用带有Storyboard的iOS 5。我的UITabBar
是使用接口生成器创建的。我的TabBar
中有两个类似的项目,它们是同一个列表,只是其中有不同类型的项目。我所做的,但对我来说很奇怪,是为每个UITableView
和viewDidLoad
设置一个不同的"标签",然后根据标签分配正确的类型。
- (void)viewDidLoad
{
[super viewDidLoad];
if (self.tableView.tag == 1)
{
type = @"lent";
}
else if (self.tableView.tag == 2)
{
type = @"borrowed";
}
}
有更好的方法吗?我没有在代码中创建UITabBar
,所以我的AppDelegate
非常空!我设置的类型只是我的一个核心数据实体中的一个属性,在一个列表上我有Borrowed Items,在另一个列表中我有Lent Items,但它们是同一个实体。
您可以在公共视图控制器上将类型公开为属性,并在选择相关选项卡栏项时设置它(来自UITabBarControllerDelegate协议的tabBarController:didSelectViewController:
-您的应用程序委托将是选项卡栏控制器委托)。
您可以按如下方式设置。声明您的应用程序委派符合UITabBarControllerDelegate协议,然后将其设置为选项卡栏控制器的委派(您必须在代码中执行此操作,因为在情节提要中无法连接到应用程序委派)。在您的应用程序DidFinishLaunching中,在返回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变量强制转换为实际的视图控制器类,并将相关标记分配给每个视图控制器的选项卡栏项。
您所拥有的应该可以正常工作。另一种选择是拥有一个具有所有功能的通用UIViewController超级类,然后将该基类子类化,并提供一个设置适当类型的viewDidLoad实现。然后在界面生成器中,您可以将UITabBar视图控制器设置为适当的子类型。
结果是一样的,但在IB中可能会更清楚发生了什么,因为你不必依赖于记住每个数字标签的含义。