我目前有一个包含5个对象的标签栏。 我想要做的是,如果用户按下第三个对象,弹出窗口将覆盖当前屏幕,而不是将其移动到另一个屏幕。然后,一旦用户按下其中一个弹出窗口,它将会将它们移动到下一个屏幕。我目前无法让这个弹出窗口发生。我该怎么做呢?我在草图中做了一个视图来向你展示我的意思(弹出窗口周围有红色框):
我试图改变对象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
}
}
答案 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上的结果截图如下。 当我按下第三个标签栏项目时,将显示两个按钮:按“取消”保持,按“设置”显示第三个视图。
我只是用一种直截了当的方式来说明这个想法,确保你可以把外观打磨得更漂亮。