Swift 4 - определение только одного текстового поля в качестве делегата для editDidEnd и т. Д. - PullRequest
0 голосов
/ 22 мая 2018

Я оставил этот вопрос свободным от конкретного контекста, потому что уверен, что он будет полезен для других:

У меня есть 2 выходных текстовых поля IB:

@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!

Я хочучтобы иметь возможность отключить кнопки на моей странице, пока оба не будут заполнены должным образом, поэтому я использую следующие делегаты в ViewDidLoad () (я добавил TextFieldDelegate в свой VC.)

override func viewDidLoad() {
    textField1.delegate = self
    textField2.delegate = self
}

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

Что я хочу сделать, это проверить только проверку в textField1, а не вполя 2.Т.е. желаемым выводом является то, что это печатается, когда пользователь начинает редактировать textField1, но если пользователь редактирует textField2, ничего не печатается.

В настоящее время я использую:

func textFieldDidBeginEditing(_ textField1: UITextField) {
    print("TextField did begin editing method called")
}

Но это печать, когда либоtextField отредактирован.

Я думал, что указал _ textField1, поэтому не уверен, почему оба запускают его?

Есть некоторые ответы, решающие аналогичные проблемы для Swift 3 и более ранних версий.В частности, один ответ ссылался на эту ссылку http://sourcefreeze.com/uitextfield-and-uitextfield-delegate-in-swift/, что я нашел полезным, но застрял на этой ошибке.

Ответы [ 6 ]

0 голосов
/ 22 мая 2018

Давайте сначала проанализируем ваш кусок кода и посмотрим, что не так:

func textFieldDidBeginEditing(_ textField1: UITextField) {
    print("TextField did begin editing method called")
}

Вы переименовали textField в textField1.Тем не менее, не называет элемент пользовательского интерфейса, который должен отвечать за это действие.Вместо этого это параметр функции , который позволяет получить доступ к информации об объекте, вызвавшем действие, изнутри вашей функции независимо от внешней области видимости.Вместо этого вы должны использовать оператор === , который проверяет, указывают ли две ссылки на один и тот же экземпляр объекта.Таким образом, ваш код должен стать:

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField === self.textField1 {
        print("TextField 1 did begin editing method called")
    }
}
0 голосов
/ 22 мая 2018

просто установите тег для обоих textFields как 0 и 1, затем в вашем методе делегата просто проверьте тег вашего текстового поля.

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField.tag == 0 {  
        print("TextField did begin editing method called for text field 1")
    }
}
0 голосов
/ 22 мая 2018

вы можете сделать оба способа: либо вы можете поставить условие if на textfield, как сказал Пол, либо, если вы не хотите, чтобы textfield2 работала с любым из делегатов текстового поля, вы можете удалить строку

  textField2.delegate = self
0 голосов
/ 22 мая 2018

UITextField метод делегата позволяет вам идентифицировать то, что textField начинает редактировать, поэтому вам просто нужно проверить, является ли это ваш 1-й textField или не такой.

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField == self.textField1 {
        print("TextField did begin editing method called")
        // Do your Validate for first text field
    } else {
        //Do Nothing
    }
}
0 голосов
/ 22 мая 2018

Вы назвали параметр, который получает ссылку UITextField, которая передается методу делегата textField1;имя этого параметра не имеет ничего общего с именем вашей собственности.Вы могли бы назвать его textField, и ваш код все равно скомпилировался бы, несмотря на отсутствие свойства с именем textField.

. Вам нужно сравнить экземпляр UITextField, который был передан методу делегата:

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField === self.textField1 {  
        print("TextField did begin editing method called for text field 1")
    }
}
0 голосов
/ 22 мая 2018

Вот почему функция-делегат textFieldDidBeginEditing имеет параметр textField.Переименование ничего не дает.

Если вы хотите различить текстовые поля, сравните параметр textField с вашими IBOutlet с, например:

func textFieldDidBeginEditing(_ text Field: UITextField) {
    if textField == textField1 {
        // Validate first text field
    } else if textField == textField2 {
        // Validate second text field
    }

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