如何使用手动 UITabbar 并使用它来切换其他 ViewControllers?

How to use a manual UITabbar and use it to switch through other ViewControllers?

我创建了一个手动 UITabbar,并创建了 3 个 TabBarItem,我想用它们在其他 Viewcontroller 之间切换。我找不到在整个应用程序中使用 BarItems 切换其他 Viewcontroller 的方法。有没有办法以编程方式切换 Viewcontroller ?我正在使用 Swift。

这是我的 ViewController.swift 文件...

class ViewController: UIViewController, UITabBarDelegate {

    // All Outlets Connected to StoryBoard
    @IBOutlet var BTN: UIButton!
    @IBOutlet var BTN2: UIButton!
    @IBOutlet var BTN3: UIButton!
    @IBOutlet var BTN4: UIButton!
    @IBOutlet var tbl: UITableView!
    @IBOutlet var Button: UIBarButtonItem!
    @IBOutlet var AllButton: UITabBarItem!//First Item
    @IBOutlet var TabBar1: UITabBar! //Manual UITabbar
    @IBOutlet var PriorityButton: UITabBarItem!//Third Item
    @IBOutlet var ClassesButton: UITabBarItem!//Second Item
    @IBOutlet var Bar: UINavigationItem!

    //Other Variables
    var varView = Int()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        if revealViewController() != nil {
            Button.target = revealViewController()
            Button.action = #selector(SWRevealViewController.revealToggle(_:))
        }

        self.view.backgroundColor = UIColor(red: 50 / 255.0, green: 132 / 255.0, blue: 255 / 255.0, alpha: 1.0)

        BTN.alpha = 1.0
        BTN4.alpha = 0
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func BTNClicked(sender: AnyObject) {
        UIView.animateWithDuration(1.0, animations: ({
            self.BTN2.transform = CGAffineTransformMakeTranslation(0, -90)
            self.BTN3.transform = CGAffineTransformMakeTranslation(0, -180)
            self.BTN4.transform = CGAffineTransformMakeTranslation(0, 0)
            self.BTN.alpha = 0
            self.BTN4.alpha = 1.0
        }))
    }

    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        //This method will be called when user changes tab.

        //Do I use this? I am using a manual Tabbar just to remind you guys.
    }

UITabBar 只显示一个标签栏,并在用户选择不同的标签时告诉它的代表。 UITabBarController 完全符合您的要求:它管理 collection 视图控制器,当用户选择不同的选项卡时在它们之间切换。使用 UITabBarController 并没有什么神奇的或非程序化的——如果你不想使用故事板,你总是可以在代码中配置一个 UITabBarController。除非有什么事情没有告诉我们,否则您应该使用 UITabBarController.

如果您真的只想使用 UITabBar,您可以在视图控制器中实现 UITabBarDelegate 并将视图控制器设置为选项卡栏的委托。当用户点击一个选项卡时,您的 -tabBar:didSelectItem: 方法将被调用,您可以做任何您想做的事情,包括切换到不同的视图。选项卡栏不会为您进行切换——UITabBar 只是 选项卡栏视图,没有任何用于管理视图或视图控制器的逻辑。

你的问题标题说你想在视图 控制器 之间切换,而不仅仅是视图。但是您可能希望标签栏始终可见。这意味着您需要创建一个视图控制器,该视图控制器维护与选项卡项关联的视图控制器列表,具有 child 视图控制器,并实现 UITabBarDelegate 以替换 child 每当调用 -tabBar:didSelectItem: 时查看控制器。简而言之,您需要复制 UITabBarController 已经完成的工作。

如果您真的想在不使用 UITabBarController 的情况下将 UITabBar 添加到控制器,请尝试以下 class。它只是骨架,只显示您真正需要的内容。此示例假定您已将 UITabBar 添加到情节提要中的控制器,如 @IBOutlet 所示。我亲自试过了,效果很好。

public class MyViewController: UIViewController, UITabBarDelegate {
  @IBOutlet var tabBar: UITabBar!

  public override func viewDidLoad() {
    super.viewDidLoad()
    self.tabBar?.delegate = self // this is the important step!
  }

  public func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    print("selected")
  }
}