Как UIButton может одновременно прослушивать изменения других кнопок, изменения текста UILabel и изменения UITextView - PullRequest
0 голосов
/ 02 октября 2018

Мой ВК содержит:

-1 имя textView

-1 ярлык // для ароматов

-2 переключателя // да и нет

-1 nextButton

То, что я хочу сделать, - это отключить nextButton до тех пор, пока не будет заполнено textView, текстовое значение метки изменится с исходного названия «Pick a Flavor» на любой выбранный ими аромат, иВыбраны 1 из переключателей.

Я знаю, что с помощью textView's textViewDidEndEditing() Я могу прослушать изменения в нем после того, как пользователь закончит редактирование, отключить или включить nextButton.

func textViewDidEndEditing(_ textView: UITextView) {
    handleTextInputChanged()
}

@objc func handleTextInputChanged() {
    let isFormValid = nameTextView.text?.count ?? 0 > 0

    if isFormValid {
        nextButton.isEnabled = true
        nextButton.backgroundColor = .red
    } else {
        nextButton.isEnabled = false
        nextButton.backgroundColor = .lightgray
    }
}

Как бы я дополнительно отключил или включил nextButton в зависимости от того, была ли выбрана одна из переключателей, и текст метки был изменен в дополнение к проверке, что внутри nameTextView есть текст?

К сведению, текст ярлыка изначально установлен с помощью «Pick a Flavor».У меня есть распознаватель жестов, подключенный к нему, и когда он нажал новый VC с tableView представлен.Пользователь выбирает аромат, протокол отправляет его обратно на этот виртуальный канал, и текст метки изменится на тот, который был выбран (например, заголовок метки скажет «Butter Pecan», если он выбран).Кнопка NextButton должна быть отключена, если заголовок метки по-прежнему установлен на «Pick a Flavor».

код:

let flavorLabel: UILabel = {
    let label = UILabel()
    label.text = "Pick a Flavor"
    label.isUserInteractionEnabled = true
    return label
}()

let nameTextView: UITextView = {
    let textView = UITextView()
    return textView
}()

let noButton: DLRadioButton = {
    let button = DLRadioButton(type: .custom)
    button.setTitle("No", for: .normal)
    button.setTitleColor(UIColor.lightGray, for: .normal)
    button.addTarget(self, action: #selector(noButtonPressed), for: .touchUpInside)
    return button
}()

let yesButton: DLRadioButton = {
    let button = DLRadioButton(type: .custom)
    button.setTitle("Yes", for: .normal)
    button.setTitleColor(UIColor.lightGray, for: .normal)
    button.addTarget(self, action: #selector(yesButtonPressed), for: .touchUpInside)
    return button
}()

let nextButton: UIButton = {
    let button = UIButton(type: .system)
    button.setTitle("Next", for: .normal)
    button.setTitleColor(UIColor.white, for: .normal)
    button.isEnabled = false
    button.backgroundColor = .lightGray
    button.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside)
    return button
}()

var choice: Bool?

override func viewDidLoad() {
    super.viewDidLoad()

    flavorVC.delegate = self
}

func textViewDidEndEditing(_ textView: UITextView) {
    handleTextInputChanged()
}

@objc func handleTextInputChanged() {
    let isFormValid = nameTextView.text?.count ?? 0 > 0

    if isFormValid {
        nextButton.isEnabled = true
        nextButton.backgroundColor = .red
    } else {
        nextButton.isEnabled = false
        nextButton.backgroundColor = .lightgray
    }
}

@objc fileprivate func noButtonPressed() {
    choice = false
}

@objc fileprivate func yesButtonPressed() {
    choice = true
}

// delegate method from FlavorController
func selectedFlavor(flavor: String) {

    flavorLabel.text = flavor // eg. "Butter Pecan"
}

1 Ответ

0 голосов
/ 02 октября 2018

Вам нужно создать функцию, которая будет проверять все как это

func checkAll() {
    nextButto.isEnabled = flavorLabel.text != "Pick a Flavor" &&
    nameTextField.text != "" &&
    (noButton.someProerty != || yesButton.someProerty != )
}

и вызывать ее из текстового поля и кнопок, а также

var ob:NSKeyValueObservation?

ob = flavorLabel.observe(\.text,options:[.new], changeHandler: { [unowned self] _, change in

   self.checkAll()
}

Я оставил радио-проверки, потому что они обаявляются пользовательскими, поэтому вы должны знать, что проверять, кстати, вы можете установить тег selected в 1 внутри целевого метода и проверять в соответствии с ним или какой-либо другой логикой, которую вы хотите

...