Как определить последний актив UITextField в Xcode - PullRequest
0 голосов
/ 03 февраля 2019

Я новичок в Swift и играю с небольшим приложением-конвертером.У меня есть два TextFields и одна кнопка «конвертировать».Я хочу перезаписать текстовое поле non acticv преобразованным значением из последнего активированного TextField.Я знаю, что было бы легче с большим количеством текстовых полей и большим количеством кнопок, но я бы хотел решить эту проблему следующим образом.

Кто-нибудь может дать мне совет?

var NumberC = Int(InputCelcius.text!)!
var NumberF = Int(InputFahrenheit.text!)!

if InputCelcius.isFirstResponder {
    if (InputCelcius.text?.isEmpty)! {
        NumberC=0
        print("NumberC is empty")
    }
    NumberC = NumberC * 9/5 + 32
    InputFahrenheit.text = " \(NumberC)"
}

else if InputFahrenheit.isFirstResponder {  
    if (InputFahrenheit.text?.isEmpty)! {
        NumberF=0
        print("NumberF is empty")     
    }
    NumberF = (NumberF - 32) * 5/9
    InputCelcius.text = " \(NumberF)"
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Я бы предложил использовать функцию UITextFieldDelegate textFieldDidEndEditing.Убедитесь, что вы подклассите свой viewController как UITextFieldDelegate.

class ViewController: UIViewController, UITextFieldDelegate {

Установите для каждого делегата textField значение self в viewDidLoad.

override func viewDidLoad() {
    super.viewDidLoad() 
    InputFahrenheit.delegate = self
    InputCelsius.delegate = self
}

С этим методом вам даже не понадобитсяUIButton, но вы можете использовать кнопку, чтобы заставить textField завершить редактирование следующим образом.

@objc func buttonAction (sender: UIButton) {
    self.view.endEditing(true)
}

Что вызовет этот метод делегата, если пользователь редактировал textField.

func textFieldDidEndEditing (textField: UITextField) {
    if textField.isEmpty {return} //this prevents nil errors and user would have to type in "0" if wishing to convert zero.
    if textField == InputCelsius {
        let conversion = Float(textField.text!) * 9/5 + 32
        InputFahrenheit.text = String(format: “%.f”, conversion) //“%.1f” will show one decimal place and so forth
    } else if textField == InputFahrenheit {
        let conversion = ( Float(textField.text!) - 32 ) * 5/9
        InputCelsius.text = String(format: “%.f”, conversion)
    }
}
0 голосов
/ 03 февраля 2019

Я не совсем уверен в этом, но я думаю, что если вы нажмете кнопку, сама кнопка станет первым респондентом, поэтому ваш код не будет работать.

Правильный способ сделать это, будетбыть для установки функций IBAction, которые вызываются, когда вы заканчиваете редактирование одного из ваших текстовых полей.Просто подключите текстовые поля внутри вашей раскадровки к коду, как вы это делали с помощью кнопки.

Затем вы можете настроить две функции, по одной для каждого из текстовых полей, чтобы вам не пришлось беспокоиться о первом респонденте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...