UITabBar - 使用Storyboard的两个视图(笔尖)相同的类

时间:2012-01-19 19:53:35

标签: iphone objective-c ios

我正在使用iOS 5和Storyboard。我的UITabBar是使用Interface Builder创建的。我的TabBar中有两个相似的项目,它们是相同的列表,只有不同类型的项目。我所做的,但看起来很奇怪,是为每个UITableViewviewDidLoad设置了不同的“标记”,然后根据标记指定了正确的类型。

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (self.tableView.tag == 1)
    {
        type = @"lent";
    }
    else if (self.tableView.tag == 2)
    {
        type = @"borrowed";
    }
}

有更好的方法吗?我没有在代码中创建UITabBar,所以我的AppDelegate非常空!我设置的类型只是我的一个核心数据实体中的一个属性,在列表中我有借用项目,另一个我有借阅项目,但它们是同一个实体。

2 个答案:

答案 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中可能会更清楚一些事情,因为您不必依赖于记住每个数字标记的含义。