如何为选项卡栏控制器创建参照插座

How to create a referencing outlet for a Tab Bar Controller

提问人:JOHNY 提问时间:8/8/2023 最后编辑:JOHNY 更新时间:8/9/2023 访问量:37

问:

我在故事板中创建了一个标签栏,我将其链接到一个 swift 文件以添加一些属性,一切正常。但后来我决定更换导航控制器,现在我无法设置添加到选项卡栏的属性。screenshott

有人知道如何设置标签栏控制器的属性吗?(我真的看不出标签栏和标签栏控制器之间的区别)。

iOS Swift Xcode UIViewController(英语:UIViageController) UITabBarController

评论

0赞 Quack E. Duck 8/8/2023
A 与 a 不同 - 请编辑您的问题以澄清您当前使用的是哪一个。答案会有所不同,具体取决于它的实际情况。从屏幕截图中可以看出,您正在尝试使用 .A 包含一个包含选项卡栏项的选项卡栏,但选项卡栏控制器与选项卡栏不同。这同样适用于导航视图控制器 - 它包含导航栏和导航项,但与它们不同。UINavigationControllerUITabBarControllerUITabBarControllerUITabBarController
0赞 JOHNY 8/8/2023
@QuackE.Duck 我在标签栏的每个“项目”内使用导航控制器,但我的问题出在标签栏控制器上。当它只是一个选项卡栏时,我可以更改其属性,但现在我不能。如何以编程方式更改 ?我无法使用 IBOutlet 将其链接到 swift 文件,还有其他方法吗?UITabBarControllerUITabBarController

答:

1赞 Quack E. Duck 8/9/2023 #1

这是一种特殊的类型,具有内置的.由于选项卡栏已包含在此类中,因此无需为选项卡栏设置选项卡栏,也无需添加委托协议一致性。在选项卡栏 ViewController 类定义中,只需通过变量名称引用选项卡栏,其他所有内容的工作方式将与屏幕截图中的完全相同(我在此答案的底部提供了一张图片以进行比较。UITabBarControllerUIViewControllerUITabBar@IBOutlettabBar

要使其正常工作,必须首先正确设置 ViewController。以下是我采取的步骤:UITabBarController

  1. 在新的 Xcode 项目中,删除默认的 ViewController.swift 文件,并从 Main.storyboard 中删除视图控制器。

  2. 从右上角的“库”菜单中,向下滚动,直到找到“选项卡栏控制器”。它应该与其他视图控制器位于该部分中。将其中一个拖放到现在为空的情节提要上。+

  3. 在左侧边栏的文件菜单中,右键单击 -> 新建文件 -> Cocoa Touch Class -> 随心所欲地命名(我只选择了“ViewController”),对于 Subclass of:,选择 .您不必选中“同时创建 XIB 文件”框。UITabBarController

  4. Main.storyboard 中,选择 并在“属性检查器”(在右侧边栏中)下,将其类设置为在上一步中选择的任何名称。现在,当您在助手模式下的“调整编辑器选项”下查看它们时,您可以看到连接到故事板项的 .swift 文件——就像您在屏幕截图中一样。UITabBarController

  5. 将屏幕截图中当前包含的所有选项卡栏外观设置复制并粘贴到视图控制器的方法中,但进行了以下更改:只要有“tabBarMenu”(这似乎是旧@IBOutlet的名称?),请将其更改为“tabBar”。viewDidLoad

您最终应该在视图控制器 .swift 文件中得到这个:

import UIKit

// This is not the same class as UITabBar! No delegate protocol conformance is needed (it's already built in to this kind of View Controller)
class ViewController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // The controller's Tab Bar doesn't need (or even allow) an @IBOutlet, because the UITabViewController class is designed with the Tab Bar built-in and already assigned to the name "tabBar"
        
        // Here are all the same settings you had in your screenshot:
        tabBar.layer.shadowColor = UIColor.gray.cgColor
        tabBar.layer.shadowOpacity = 0.5
        tabBar.layer.shadowOffset = CGSize.zero
        tabBar.layer.borderColor = UIColor.clear.cgColor
        tabBar.layer.borderWidth = 0
        tabBar.clipsToBounds = false
        tabBar.backgroundColor = UIColor.white
        
        UITabBar.appearance().shadowImage = UIImage()
        UITabBar.appearance().backgroundImage = UIImage()
        
    }
}

结果将是这样的:enter image description here