Как изменить то, что отображается при изменении индекса UISegmentedControl? - PullRequest
2 голосов
/ 15 октября 2019

У меня небольшая проблема с моим сегментированным контроллером, и я пытаюсь изменить представления, отображаемые пользователю при нажатии на новый индекс. У меня есть код для отображения текстовых полей, которые пользователь будет вводить при изменении индекса. Одна проблема заключается в том, что я хочу разместить текстовые поля под сегментированным контроллером равномерно, а другая проблема заключается в том, что когда я щелкаю новый индекс в контроллере, предыдущее текстовое поле остается на экране, но мне нужно, чтобы оно отображало толькотекстовое поле, соответствующее выбранному индексу. Код показан ниже, где я создал контроллер сегмента и обработал переключение индексов, а также создание текстовых полей.

    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
        }();

Большинство из рассмотренных мною решений устарели, поэтомуЯ публикую свою версию здесь. Заранее благодарен за помощь, которую может оказать каждый.

1 Ответ

1 голос
/ 15 октября 2019

Вы можете установить tag для каждого UITextField, как показано ниже,

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
}()

enter image description here

...