来自TabBar的弹出窗口

时间:2017-06-23 05:38:33

标签: ios swift swift3 popup uitabbar

我目前有一个包含5个对象的标签栏。 我想要做的是,如果用户按下第三个对象,弹出窗口将覆盖当前屏幕,而不是将其移动到另一个屏幕。然后,一旦用户按下其中一个弹出窗口,它将会将它们移动到下一个屏幕。我目前无法让这个弹出窗口发生。我该怎么做呢?我在草图中做了一个视图来向你展示我的意思(弹出窗口周围有红色框): Example

我试图改变对象3和它的视图控制器之间的segue,但它不起作用,因为对象3甚至出现在tabbar上,你需要一个"关系Segue:view controllers"。为了弹出,我需要一个Present Modally segue(我在视图控制器segues中为segue做的类型)。因此,如果我做一个现在的模态segue,而不是"关系Segue:视图控制器"从tabbar控制器到我的弹出窗口控制器,我不会有"对象3"并且只有4个标签栏图标而不是5个。

----编辑---- @ Flickerlight的逻辑:

`

import UIKit

@available(iOS 9.0, *)
let tbh = TabBarHandler()

@available(iOS 9.0, *)
class TabBarHandler: NSObject, UITabBarControllerDelegate{
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let vcIndex = tabBarController.viewControllers!.index(of: viewController)!
        if  vcIndex == 2 {
            let button1 = UIButton()
            button1.setTitle("Cancel", for: .normal)
            button1.layer.cornerRadius = 5
            button1.setTitleColor(UIColor.white, for: .normal)
            button1.addTarget(self, action: #selector(cancelButtonPressed(_:)), for: .touchUpInside)
            button1.backgroundColor = UIColor.lightGray

            let button2 = UIButton()
            button2.setTitle("Settings", for: .normal)
            button2.layer.cornerRadius = 5
            button2.backgroundColor = UIColor.lightGray
            button2.setTitleColor(UIColor.white, for: .normal)
            button2.addTarget(self, action: #selector(settingButtonPresssed(_:)), for: .touchUpInside)

            let sv = UIStackView(arrangedSubviews: [button1,button2])
            sv.distribution = .equalSpacing

            let currentView = tabBarController.selectedViewController!.view!
            sv.frame = CGRect(x: currentView.bounds.midX - 80, y: currentView.bounds.midY + 150, width: 160, height: 40)
            currentView.addSubview(sv)
            currentView.bringSubview(toFront: sv)
            return false
        }else{
            return true
        }
    }

    @objc func cancelButtonPressed(_ sender:UIButton) {
        if let parentStackView = sender.superview as? UIStackView {
            parentStackView.removeFromSuperview()
        }
    }
    @objc func settingButtonPresssed(_ sender:UIButton){
        if let parentStackView = sender.superview as? UIStackView {
            parentStackView.removeFromSuperview()
            if let tabBC = UIApplication.shared.windows[0].rootViewController as? UITabBarController {
                tabBC.selectedIndex = 2
            }
        }
    }
}`

在我的第一个视图控制器的viewDidLoad中:

self.tabBarController?.delegate = tbh

在tabBarController中:

 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        if viewController.tabBarItem.tag == 1 {
            return false
        } else {
            return true
        }
    }

1 个答案:

答案 0 :(得分:2)

我的想法是,您可以实施UITabbarControllerdelegate并使用"shouldSelect"方法。

在这种方法中,

1.检查当前要选择的项目是否为第三项。

2.如果是这样,请显示您的弹出窗口,并返回false以使标签保持在当前视图中。

3.在弹出的buttonPressed方法中,以编程方式实现相应选项卡的选择。

更新:

Keypoint,您需要以编程方式指示tabbarcontroller转到您的视图。

在我的项目中尝试使用按钮解决方案(如您所愿),下面的代码可以正常工作。

let tbh = tabbarHandler()

class tabbarHandler:NSObject,UITabBarControllerDelegate{
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let vcIndex = tabBarController.viewControllers!.index(of: viewController)!
        if  vcIndex == 2 {
            let button1 = UIButton()
            button1.setTitle("Cancel", for: .normal)
            button1.layer.cornerRadius = 5
            button1.setTitleColor(UIColor.white, for: .normal)
            button1.addTarget(self, action: #selector(cancelButtonPressed(_:)), for: .touchUpInside)
            button1.backgroundColor = UIColor.lightGray

            let button2 = UIButton()
            button2.setTitle("Settings", for: .normal)
            button2.layer.cornerRadius = 5
            button2.backgroundColor = UIColor.lightGray
            button2.setTitleColor(UIColor.white, for: .normal)
            button2.addTarget(self, action: #selector(settingButtonPresssed(_:)), for: .touchUpInside)

            let sv = UIStackView(arrangedSubviews: [button1,button2])
            sv.distribution = .equalSpacing

            let currentView = tabBarController.selectedViewController!.view!
            sv.frame = CGRect(x: currentView.bounds.midX - 80, y: currentView.bounds.midY + 150, width: 160, height: 40)
            currentView.addSubview(sv)
            currentView.bringSubview(toFront: sv)
            return false
        }else{
            return true
        }
    }

    @objc func cancelButtonPressed(_ sender:UIButton) {
        if let parentStackView = sender.superview as? UIStackView {
            parentStackView.removeFromSuperview()
        }
    }
    @objc func settingButtonPresssed(_ sender:UIButton){
        if let parentStackView = sender.superview as? UIStackView {
            parentStackView.removeFromSuperview()
            if let tabBC = UIApplication.shared.windows[0].rootViewController as? UITabBarController {
                tabBC.selectedIndex = 2
            }
        }
    }
}

请记住初始化委托对象并将tabbarController的委托分配给它。

在我的尝试中,我将对象初始化为全局变量,并在第一个视图的viewDidLoad()中将其附加到tabbarController:

self.tabBarController?.delegate = tbh

我的iphone上的结果截图如下。 当我按下第三个标签栏项目时,将显示两个按钮:按“取消”保持,按“设置”显示第三个视图。

我只是用一种直截了当的方式来说明这个想法,确保你可以把外观打磨得更漂亮。

enter image description here

相关问题