Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建自定义线段顶部选项卡视图控制器?(Swift)_Ios_Swift - Fatal编程技术网

Ios 如何创建自定义线段顶部选项卡视图控制器?(Swift)

Ios 如何创建自定义线段顶部选项卡视图控制器?(Swift),ios,swift,Ios,Swift,我有一个2段顶标签VC类,感谢在软件的人。 下面是截图 //2段顶部选项卡VC class SegmentTabVC: UIViewController { //MARK: - Properties let viewControllers: [UIViewController] init(viewControllers: [UIViewController], nibName nibNameOrNil: String? = nil, bundle n

我有一个2段顶标签VC类,感谢在软件的人。 下面是截图

//2段顶部选项卡VC

class SegmentTabVC: UIViewController {
    
    //MARK: - Properties

    let viewControllers: [UIViewController]
    
    init(viewControllers: [UIViewController], nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.viewControllers = viewControllers
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private let leftButton: UIButton = {
        let bt = UIButton()
        bt.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
        bt.setAttributedTitle(NSMutableAttributedString(string: "미팅", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).darker(componentDelta: 0.4)]), for: .selected)
        bt.setAttributedTitle(NSMutableAttributedString(string: "미팅", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).lighter(componentDelta: 0.4)]), for: .normal)
        bt.tag = 0
        
        return bt
    }()
    
    private let rightButton: UIButton = {
        let bt = UIButton()
        bt.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
        bt.setAttributedTitle(NSMutableAttributedString(string: "번개", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).darker(componentDelta: 0.4)]), for: .selected)
        bt.setAttributedTitle(NSMutableAttributedString(string: "번개", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).lighter(componentDelta: 0.4)]), for: .normal)
        bt.tag = 1
        
        return bt
    }()
        
    private let contentView: UIView = {
        let view = UIView()
        
        return view
    }()
    
    var currentVC: UIViewController?
    
    lazy var bannerTabVC = viewControllers[0]
    lazy var gravitySliderTabVC = viewControllers[1]
    
    
    //MARK: - Life Cycles
        
    override func viewDidLoad() {
        super.viewDidLoad()
        configureUI()
        leftButton.isSelected = true
        displayCurrentTab(0)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if let currentVC = currentVC {
            currentVC.viewWillDisappear(animated)
        }
    }
    
    //MARK: - Selectors
    
    @objc func switchTabs(_ sender: UIButton) {
        self.currentVC!.view.removeFromSuperview()
        self.currentVC!.removeFromParent()
        
        switch sender.tag {
        case 0:
            rightButton.isSelected = false
            leftButton.isSelected = true
        case 1:
            rightButton.isSelected = true
            leftButton.isSelected = false
        default:
            return
        }
        
        displayCurrentTab(sender.tag)
    }
            
    //MARK: - Helpers
    
    func configureUI() {
        view.backgroundColor = .white
        
        let stack = UIStackView(arrangedSubviews: [leftButton, rightButton])
        stack.axis = .horizontal
        stack.distribution = .fillEqually
        
        view.addSubview(stack)
        stack.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 50)
        
        view.addSubview(contentView)
        contentView.anchor(top: stack.bottomAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor)
    }
    
    func displayCurrentTab(_ tabIndex: Int){
        if let vc = viewControllerForSelectedSegmentIndex(tabIndex) {
            self.addChild(vc)
            vc.didMove(toParent: self)
            
            vc.view.frame = self.contentView.bounds
            self.contentView.addSubview(vc.view)
            self.currentVC = vc
        }
    }
    
    func viewControllerForSelectedSegmentIndex(_ index: Int) -> UIViewController? {
        var vc: UIViewController?
        switch index {
        case 0 :
            vc = viewControllers[0]
        case 1 :
            vc = viewControllers[1]
        default:
            return nil
        }
        
        return vc
    }

}

上述代码有效。 现在,我想为N段创建一个自定义段顶部选项卡VC类。 我不习惯自定义类。有人能帮我吗? 下面是我正在努力解决的代码

class Utilities {
    func segmentButton(_ title: String, _ tag: Int) -> UIButton {
        let bt = UIButton()
        bt.setAttributedTitle(NSMutableAttributedString(string: title, attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).darker(componentDelta: 0.4)]), for: .selected)
        bt.setAttributedTitle(NSMutableAttributedString(string: title, attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).lighter(componentDelta: 0.4)]), for: .normal)
        bt.tag = tag
        
        return bt
    }
}

class SegmentTabVC: UIViewController {
    
    //MARK: - Properties

    let viewControllers: [UIViewController]
    let titles: [String]
    let buttons: [UIButton]
    var currentIndex: Int
    
    init(viewControllers: [UIViewController], titles: [String], nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.viewControllers = viewControllers
        self.titles = titles
        
        for index in 0 ..< viewControllers.count {
            let button = Utilities().segmentButton(titles[index], index)
            button.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
            self.buttons.append(button)
        }
        
        self.currentIndex = 0
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    ...
}
类实用程序{
func segmentButton(u标题:String,uTag:Int)->UIButton{
设bt=UIButton()
bt.setAttributedTitle(NSMutableAttributedString(字符串:标题,属性:[NSAttributedString.Key.font:UIFont.boldSystemFont(ofSize:17),NSAttributedString.Key.foregroundColor:#colorLiteral(红色:0.1393318772,绿色:0.149351731,蓝色:0.2001486421,alpha:1)。颜色更深(组件增量:0.4)],用于:。选定)
bt.setAttributedTitle(NSMutableAttributedString(字符串:标题,属性:[NSAttributedString.Key.font:UIFont.boldSystemFont(大小:17),NSAttributedString.Key.foregroundColor:#colorLiteral(红色:0.1393318772,绿色:0.149351731,蓝色:0.2001486421,alpha:1)。打火机(组件增量:0.4)],用于:。正常)
bt.tag=tag
返回bt
}
}
类SegmentTabVC:UIViewController{
//标记:-属性
让查看控制器:[UIViewController]
让标题:[字符串]
let按钮:[UIButton]
var-currentIndex:Int
init(viewControllers:[UIViewController],titles:[String],nibName-nibNameOrNil:String?=nil,bundle-nibBundleOrNil:bundle?=nil){
self.viewControllers=viewControllers
self.titles=标题
对于0中的索引..
对于将来遇到同样问题的人:

import UIKit

class SegmentTabVC: UIViewController {
    
    //MARK: - Properties

    let viewControllers: [UIViewController]
    let titles: [String]
    
    init(viewControllers: [UIViewController], titles: [String], nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.viewControllers = viewControllers
        self.titles = titles
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    var currentIndex: Int = 0
    var buttons: [UIButton] = []
    
    var topView: UIView = {
        let view = UIView()
        view.backgroundColor = #colorLiteral(red: 0.7254901961, green: 0.6705882353, blue: 0.9607843137, alpha: 1)

        return view
    }()
    
    private let contentView = UIView()
    
    var currentVC: UIViewController?
   
    //MARK: - Life Cycles
        
    override func viewDidLoad() {
        super.viewDidLoad()
        prepareButtons()
        configureUI()
        buttons[0].isSelected = true
        displayCurrentTab(currentIndex)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if let currentVC = currentVC {
            currentVC.viewWillDisappear(animated)
        }
    }
    
    //MARK: - Selectors
    
    @objc func switchTabs(_ sender: UIButton) {
        self.currentVC!.view.removeFromSuperview()
        self.currentVC!.removeFromParent()
        
        buttons[currentIndex].isSelected = false
        buttons[sender.tag].isSelected = true
        currentIndex = sender.tag
        
        displayCurrentTab(currentIndex)
    }
            
    //MARK: - Helpers
    
    func createButton(_ index: Int) -> UIButton {
        let button = Utilities().segmentButton(titles[index], index)
        button.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
        return button
    }
    
    func prepareButtons() {
        for index in 0 ..< viewControllers.count {
            buttons.append(createButton(index))
        }
    }
    
    func configureUI() {
        navigationController?.navigationBar.isHidden = true
        view.backgroundColor = .white
        
        let safeTopView = UIView()
        safeTopView.backgroundColor = #colorLiteral(red: 0.7254901961, green: 0.6705882353, blue: 0.9607843137, alpha: 1)
        view.addSubview(safeTopView)
        safeTopView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.topAnchor, right: view.rightAnchor)
                
        view.addSubview(topView)
        topView.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 56)
        
        let stack = UIStackView(arrangedSubviews: buttons)
        stack.axis = .horizontal
        stack.distribution = .fillEqually
        
        view.addSubview(stack)
        stack.anchor(top: topView.bottomAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 44)
        
        let dividerView = UIView()
        dividerView.backgroundColor = .systemGray6
        view.addSubview(dividerView)
        dividerView.anchor(top: stack.bottomAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 0.75)
        
        view.addSubview(contentView)
        contentView.anchor(top: dividerView.bottomAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor)
    }
    
    func displayCurrentTab(_ tabIndex: Int){
        let selectedVC = viewControllers[tabIndex]
        
        self.addChild(selectedVC)
        selectedVC.didMove(toParent: self)
        
        selectedVC.view.frame = self.contentView.bounds
        self.contentView.addSubview(selectedVC.view)
        self.currentVC = selectedVC
    }
}

import UIKit

class MeetVC: SegmentTabVC {
    
    //MARK: - Properties
    
    init() {
        super.init(viewControllers: [MY_VC_0(), MY_VC_1(), MY_VC_2(), MY_VC_3()], titles: ["MY_TITLE_0", "MY_TITLE_1", "MY_TITLE_2", "MY_TITLE_3"])
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
        
    //MARK: - Life Cycles
        
    //MARK: - Selectors
                    
    //MARK: - Helpers
    
    override func configureUI() {
        super.configureUI()
        // Whatever..

    }
}
导入UIKit
类SegmentTabVC:UIViewController{
//标记:-属性
让查看控制器:[UIViewController]
让标题:[字符串]
init(viewControllers:[UIViewController],titles:[String],nibName-nibNameOrNil:String?=nil,bundle-nibBundleOrNil:bundle?=nil){
self.viewControllers=viewControllers
self.titles=标题
super.init(nibName:nil,bundle:nil)
}
必需初始化?(编码器:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
var currentIndex:Int=0
变量按钮:[UIButton]=[]
变量topView:UIView={
let view=UIView()
view.backgroundColor=#colorLiteral(红色:0.7254901961,绿色:0.6705882353,蓝色:0.9607843137,alpha:1)
返回视图
}()
私有let contentView=UIView()
var currentVC:UIViewController?
//马克:生命周期
重写func viewDidLoad(){
super.viewDidLoad()
准备按钮()
configureUI()
按钮[0]。isSelected=true
显示当前选项卡(当前索引)
}
覆盖函数视图将消失(u动画:Bool){
超级。视图将消失(动画)
如果让currentVC=currentVC{
currentVC.ViewWillEnglish(动画)
}
}
//标记:-选择器
@objc func开关选项卡(\发送方:UIButton){
self.currentVC!.view.removeFromSuperview()
self.currentVC!.removeFromParent()
按钮[currentIndex]。isSelected=false
按钮[sender.tag].isSelected=true
currentIndex=sender.tag
显示当前选项卡(当前索引)
}
//马克:助手
func createButton(u索引:Int)->UIButton{
let button=Utilities().segmentButton(标题[索引],索引)
button.addTarget(self,action:#选择器(开关选项卡),for:.touchUpInside)
返回按钮
}
func prepareButtons(){
对于0中的索引..