【问题标题】:How do I change what is shown when the UISegmentedControl index is changed?如何更改 UISegmentedControl 索引更改时显示的内容?
【发布时间】:2019-10-15 12:43:36
【问题描述】:

我的分段控制器有一个小问题,并尝试在单击新索引时更改向用户显示的视图。我设置了代码以显示用户在更改索引时输入的文本框。一个问题是我想在分段控制器下均匀放置文本框,另一个问题是当我单击控制器中的新索引时,先前的文本框仍在屏幕上,但我需要它只显示与所选特定索引相关的文本框。代码如下所示,我在其中创建了段控制器并处理了索引的切换以及文本框的创建。

    let segmentedControl: UISegmentedControl = {
        let sc = UISegmentedControl(items: ["Inventory", "Sale", "Expense"])
        sc.selectedSegmentIndex = 0
        sc.layer.cornerRadius = 9
        sc.layer.borderWidth = 1
        sc.layer.borderColor = UIColor.lightGray.cgColor
        sc.layer.masksToBounds = true

        sc.addTarget(self, action: #selector(handleSegmentChange), for: .valueChanged)
        return sc
    }()

    //function to handle click of segmented control buttons
    @objc fileprivate func handleSegmentChange(sender: UISegmentedControl){
        print(segmentedControl.selectedSegmentIndex)

        switch segmentedControl.selectedSegmentIndex{
        case 0:
            view.addSubview(myProduct)
        case 1:
            view.addSubview(myRetail)
        default:
            view.addSubview(myExpense)
            break
        }

    }

    let myProduct : UITextField = {
        let mp = UITextField(frame: CGRect(x: 10, y: 320, width: 300, height: 10))
        mp.placeholder = "Enter Product name"
        mp.borderStyle = UITextField.BorderStyle.line
        mp.backgroundColor = .white
        mp.textColor = .cyan

        return mp
        }();

    let myRetail : UITextField = {
        let mp = UITextField(frame: CGRect(x: 10, y: 320, width: 300, height: 20))
        mp.placeholder = "Enter Retail price"
        mp.borderStyle = UITextField.BorderStyle.line
        mp.backgroundColor = .white
        mp.textColor = .cyan

        return mp
        }();

    let myExpense : UITextField = {
        let mp = UITextField(frame: CGRect(x: 10, y: 320, width: 300, height: 30))
        mp.placeholder = "Enter Expense name"
        mp.borderStyle = UITextField.BorderStyle.line
        mp.backgroundColor = .white
        mp.textColor = .cyan

        return mp
        }();

我看到的大多数解决方案都已过时,这就是我在这里发布自己的版本的原因。提前感谢任何人都可以提供的帮助。

【问题讨论】:

    标签: ios swift uisegmentedcontrol


    【解决方案1】:

    您可以为每个UITextField 设置tag,如下所示,

    let myProduct : UITextField = {
        let mp = UITextField(frame: CGRect(x: 10, y: 320, width: 300, height: 10))
        mp.placeholder = "Enter Product name"
        mp.borderStyle = UITextField.BorderStyle.line
        mp.backgroundColor = .white
        mp.textColor = .cyan
        mp.tag = 11
        return mp
    }()
    
    let myRetail : UITextField = {
        let mp = UITextField(frame: CGRect(x: 10, y: 320, width: 300, height: 20))
        mp.placeholder = "Enter Retail price"
        mp.borderStyle = UITextField.BorderStyle.line
        mp.backgroundColor = .white
        mp.textColor = .cyan
        mp.tag = 12
        return mp
    }()
    
    let myExpense : UITextField = {
        let mp = UITextField(frame: CGRect(x: 10, y: 320, width: 300, height: 30))
        mp.placeholder = "Enter Expense name"
        mp.borderStyle = UITextField.BorderStyle.line
        mp.backgroundColor = .white
        mp.textColor = .cyan
        mp.tag = 13
        return mp
    }()
    

    然后在handleSegmentChange 中,删除任何带有该标签的视图,然后再添加一个新视图,如下所示,

    //function to handle click of segmented control buttons
    @objc fileprivate func handleSegmentChange(sender: UISegmentedControl){
        print(segmentedControl.selectedSegmentIndex)
    
        [11, 12, 13].forEach { self.view.viewWithTag($0)?.removeFromSuperview() }
    
        switch segmentedControl.selectedSegmentIndex {
        case 0:
            view.addSubview(myProduct)
        case 1:
            view.addSubview(myRetail)
        default:
            view.addSubview(myExpense)
        }
    }
    

    对于位置问题,您尚未将任何框架设置为UISegmentControl。您可以如下设置frame 来获得显示的结果,

    let segmentedControl: UISegmentedControl = {
        let sc = UISegmentedControl(items: ["Inventory", "Sale", "Expense"])
        sc.selectedSegmentIndex = 0
        sc.layer.cornerRadius = 9
        sc.layer.borderWidth = 1
        sc.layer.borderColor = UIColor.lightGray.cgColor
        sc.layer.masksToBounds = true
        sc.frame = CGRect(origin: CGPoint(x: 10, y: 280), size: CGSize(width: 300, height: 30))
    
        sc.addTarget(self, action: #selector(handleSegmentChange), for: .valueChanged)
        return sc
    }()
    

    【讨论】:

    • 谢谢你,我今天晚些时候再试试。至于 UISegmentControl 的框架,它当前被放置在一个堆栈视图中,它位于导航栏中的标题下方。我计划将其从 stackview 中删除,但如果我这样做是为了使位置相同,我会将 UISegmentControl 的顶部锚点设置为导航控制器的底部锚点吗?
    • 是的,它应该固定在view的顶部。
    • 测试了您的解决方案并完美运行,非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2013-03-06
    • 2023-03-07
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多