两个故事板,一个标签栏控制器

3
因为我们正在团队中工作,所以在iOS应用程序项目中需要有多个故事板。我在某处读到,如果使用选项卡栏控制器,则无法使用多个故事板,但我相信我已经解决了这个问题。
我的问题是:
1. 这是一个好习惯吗? 2. 代码中有什么不安全的地方吗? 3. 您能预见到未来会出现任何错误吗?
我有两个Storyboard,`Main.Storyboard`和`Settings.storyboard`。请注意,在MAIN中,我将入口点嵌入了一个新的选项卡栏控制器,并通过Interface Builder添加了两个视图。
并且:
以编程方式,我想添加第三个选项卡,该选项卡转到另一个storyboard中的 `UIViewController` 。我使用以下代码完成了此操作(在 Main 的 ViewController 代码的 viewDidLoad 中)。
var settingsStoryboard:UIStoryboard = UIStoryboard(name: "Settings", bundle: nil)
var initialViewController:UIViewController = settingsStoryboard.instantiateViewControllerWithIdentifier("SettingsMain") as UIViewController

var viewsInTBC = self.tabBarController?.viewControllers
viewsInTBC?.append(initialViewController)
self.tabBarController?.viewControllers = viewsInTBC

惊人的是,它有效了!当我在视图控制器中点击第三个项目时(尽管它不显示图标或文本),我实际上可以看到该视图 - 这也引出了我的最后一个问题:

  1. 我如何添加图标和标题呢?因为在将视图添加到其中后,我似乎无法弄清楚该怎么做?
3个回答

3

广告 4

如果您想正确设置图标,则应执行以下操作:

  1. 首先,通过故事板将新的 UIViewController 附加到您的 UITabBarController
  2. 为此选项卡设置适当的图标。
  3. 删除连接。
  4. 复制并粘贴此控制器到第二个故事板,并将其设置为初始视图控制器。

或者只需以编程方式添加按钮(XML代码):

    <!--Settings-->
    <scene sceneID="Cac-NB-uhR">
        <objects>
            <navigationController definesPresentationContext="YES" id="BkC-WO-8Bx" sceneMemberID="viewController">
                <tabBarItem key="tabBarItem" title="Settings" image="icoAxis" id="PEg-DC-QVf"/>
                <navigationBar key="navigationBar" contentMode="scaleToFill" id="4RT-g8-Hp3">
                    <autoresizingMask key="autoresizingMask"/>
                </navigationBar>
                <connections>
                    <segue destination="bvJ-l1-eMt" kind="relationship" relationship="rootViewController" id="FJJ-h4-ftX"/>
                </connections>
            </navigationController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="Ane-ce-dgm" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="947" y="1037"/>
    </scene>

一开始,我在main.storyboard中获取了我的导航控制器。现在,它是从UITabBarViewController派生的:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIStoryboard *settingsStoryboard = [StoryboardManager getSettingsStoryboard];
    UINavigationController *navigationController = [settingsStoryboard instantiateInitialViewController];

    NSMutableArray *arr = [self.viewControllers mutableCopy];
    [arr addObject:navigationController];
    [self setViewControllers:arr];
}

编辑

回答你的其他问题:

广告1。

这是一个好习惯吗? 是的。如果您正在使用故事板,在您的项目中保留数十个视图控制器可能会导致以下问题:

  1. 故事板将打开得非常慢,例如需要10秒钟。这真的很让开发人员感到烦恼。
  2. 当许多开发人员在该故事板中添加/修改/删除控制器时,可能会发生合并冲突。
  3. 有时会发生关键问题,导致Storyboard和编辑器无法打开。在某些情况下,您可能被迫还原Storyboard中的更改。使用多个故事板降低了您可能会丢失已完成更改的机会。

广告2。

您是否在代码中看到任何不安全的内容? 您的代码看起来很好。唯一可能让我担心的是直接使用故事板的名称。如果您在多个位置使用设置,则应“打包”获取控制器的方法/类。如果您重命名故事板名称,则可能出现问题-然后您将不得不找到所有出现以更改它们。如果您错过其中之一,那么可能会出现一些问题。无论如何,我认为提取该方法是可选的。

广告3。

您能预见到未来会发生任何错误吗? 我没有看到任何可能发生的问题。


我认为直接修改Storyboard的XML并不是标准做法。 - Mario A Guzman
这就是为什么我展示了如何在不手动修改源代码的情况下完成这个步骤。 - Szu
列出的步骤似乎没有意义。我最终会得到两个相同的控制器,只是一个在另一个Storyboard中? - Mario A Guzman
抱歉,我写错了,“second controller”应该是“second storyboard”。我之前也遇到过和你一样的情况,但是我之前所有的连接都在一个storyboard中。通过剪切粘贴和使用instantiateViewControllerWithIdentifier等方法,我没有遇到任何关于bar icons的问题。 - Szu

1

是的,这很实用。将storyboard分离到模块中是个好主意。

与其自己进行hack,使用这个项目可以节省很多时间:RBStoryboardLink。作者有一篇关于使用storyboard的技巧的好文章:UIStoryboard Best Practices


0
您不需要进行任何黑客攻击... 在一个故事板中创建一个选项卡栏,如下所示 enter image description here 然后,您创建一个故事板引用 enter image description here 并将其添加到选项卡栏中,如下所示 enter image description here 然后,您更改要使用的故事板:
然后WALAAAAHHH!你有两个故事板一个选项卡控制器! YAYYY!

那么如何从链接的故事板中使用特定的视图控制器? - Yaseen Majeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接