Нужна ссылка на пользовательский UITableViewCell внутри метода делегата UITextField в Swift без использования свойства тега

У меня есть пользовательский UITableViewCell в моем UITableView, который содержит несколько UITextFields. Мой ViewController, содержащий мой tableView, реализует UITextFieldDelegate. Это означает, что методы делегата UITextField запускаются, когда пользователь взаимодействует с текстовыми полями.

Моя проблема в том, что мне нужно получить доступ к текстовым полям, которые содержатся внутри пользовательского UITableViewCell, из методов делегата UITextField. Проблема заключается в следующем: к сожалению, я не могу использовать свойство «тег», которое есть у UITextField. Свойство "тег" используется для чего-то другого, и на данном этапе проекта я, к сожалению, не могу его реорганизовать.

Например, в следующем методе делегата:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    //instead of: if textField.tag == someNumber
    //I would like to have something like:
    //if textField == cell.textFieldA {
    //...
    //} else if textField == cell.textFieldB {
    //...
    //}
...
}

У кого-нибудь есть идеи или предложения?


person syedfa    schedule 01.07.2016    source источник
comment
Я бы предложил, чтобы ваш подкласс ячейки реализовал делегат текстового поля и передал соответствующие события обратно в ваш контроллер представления через другой протокол делегата.   -  person Paulw11    schedule 01.07.2016
comment
Это пришло мне в голову (т. е. позволить моему подклассу ячейки реализовать UITextFieldDelegate), но я не был уверен, как связать события из подкласса ячейки с UIViewController, который содержит UITableView.   -  person syedfa    schedule 01.07.2016
comment
Пусть контроллер представления реализует ваш новый протокол (который вы определяете), и он устанавливает себя в качестве делегата ячейки в cellForRowAtIndexPath   -  person Paulw11    schedule 01.07.2016


Ответы (2)


вы можете создать расширение UITextField. что-то вроде этого:

extension UITextField {

  private struct AssociatedKeys {

    static var someId = "someId"

  }

  @IBInspectable var someId: String? {

    get {

      return objc_getAssociatedObject(self, &AssociatedKeys.someId) as? String

    }

    set {

      if let newValue = newValue {

        objc_setAssociatedObject(self, &AssociatedKeys.someId, newValue as NSString?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)

      }

    }

  }

}

Затем вы можете получить доступ и сравнить:

textField.someId
person Lie-An    schedule 01.07.2016
comment
Большое спасибо за ваш быстрый ответ. Не могли бы вы рассказать о своем решении относительно того, что вы делаете? - person syedfa; 01.07.2016
comment
Думаю, я понял. Что вы делаете, так это прикрепляете другое свойство к UITextField, которое работает так же, как свойство тега, верно? - person syedfa; 01.07.2016
comment
да исправить. вам просто нужно настроить тип переменной, которую вам нужно использовать. - person Lie-An; 01.07.2016

Вы можете попробовать код ниже. я пробовал это в цели C

NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:textField.superview.superview.center];

CustomTableViewCell *cell = [self.tableview cellForRowAtIndexPath:indexPath];
//cell.txt1 is your textfield Object
if(textField == cell.txt1)
{

}

Вы можете преобразовать его в Swift.

person Saurabh Prajapati    schedule 01.07.2016