UITabBar-两个视图(nib)使用Storyboard的同一类



我正在使用带有Storyboard的iOS 5。我的UITabBar是使用接口生成器创建的。我的TabBar中有两个类似的项目,它们是同一个列表,只是其中有不同类型的项目。我所做的,但对我来说很奇怪,是为每个UITableViewviewDidLoad设置一个不同的"标签",然后根据标签分配正确的类型。

- (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中可能会更清楚发生了什么,因为你不必依赖于记住每个数字标签的含义。

最新更新