【问题标题】:Tab Bars, View Controllers, and Story Boards选项卡栏、视图控制器和故事板
【发布时间】:2014-07-30 03:06:52
【问题描述】:

好的,所以我有一个小难题要解决。

我有一个标签栏控制器,其中两个标签(实际上是三个,但这说明了问题)具有基本相同的 UI。

它们以相同的方式显示信息,但使用不同的查询来获取该信息。

现在,因为它们是单独的选项卡,我需要在情节提要上有两个实例才能创建这些选项卡。每个选项卡还有一个 UINavigationController 用于选项卡的“根”。但这意味着我在一个中设置的任何 UI 都必须在另一个中复制。我使用运行时属性来更改控制器从何处获取信息。

我可以只有一个实例并将其连接到两个导航控制器。这意味着我可以只在一个地方进行 UI 更改,但是如何配置每个视图控制器以获取正确的信息?

我确信有办法解决这个问题,但我陷入了困境,目前找不到出路。

如果有人能理解我在说什么,请您提供任何建议。

这是我根据答案尝试过的,但它只加载到第一个标签上。随后的选项卡只有一个没有根视图的 nag 控制器。

【问题讨论】:

    标签: ios objective-c uitabbarcontroller uistoryboard


    【解决方案1】:

    您可以再次将导航控制器(及其顶部视图控制器)连接到标签栏控制器,方法是再次从标签栏控制器拖动控件,然后选择“视图控制器”。这将为您提供导航控制器的两个实例及其顶视图控制器的两个实例。这样,如果您更改 UI,您只需编辑一个场景。我从选项卡式应用程序模板开始对此进行了测试,将第二个控制器嵌入到导航控制器中,然后控制拖动到第二个导航控制器以第二次将其连接起来。你只会在导航控制器的标签栏项目中看到一个标题,所以我在 SecondViewController.m 中做了以下更改标题,

    @interface SecondViewController ()
    @property (weak,nonatomic) IBOutlet UILabel *label;
    @end
    
    @implementation SecondViewController {
        BOOL isThird;
    }
    
    -(void)awakeFromNib {
        if ([self.navigationController isEqual:self.tabBarController.viewControllers[2]]) isThird = YES;
        if (isThird) {
            self.navigationController.tabBarItem.title = @"Third";
        }
    }
    
    
    -(void)viewDidLoad {
        [super viewDidLoad];
        if (isThird) {
            self.label.text = @"Third View";
        }else{
            self.label.text = @"Second View";
        }
    }
    

    这将为您提供第三个控制器的新标题,并且您可以在代码中使用 BOOL isThird 来区分 SecondViewController 的两个实例,以便将不同的信息加载到它们中。

    【讨论】:

    • 太棒了!真是太好了,谢谢!我试图找到一种方法来访问“rootViewController”segue 并从那里解决一些问题。我没有考虑过使用 NavigationController 的标题。非常感谢。
    • 嗯...这似乎不起作用。我将编辑我的问题。
    • @Fogmeister,我没有尝试过您在编辑中显示的设置,这不是我所做的。我有两个从标签栏控制器到同一个导航控制器场景的连接。我已经编辑了我的答案以包含我的故事板的屏幕截图。
    • 啊,这可能是一个更好的方法:)
    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2016-09-12
    • 2014-06-26
    • 2017-11-25
    相关资源
    最近更新 更多