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

Имам персонализирана UITableViewCell в моя UITableView, която съдържа множество UITextFields. Моят ViewController, който съдържа моя tableView, прилага UITextFieldDelegate. Това означава, че методите на делегиране на UITextField се задействат, когато потребителят взаимодейства с textFields.

Проблемът ми е, че трябва да осъществя достъп до textFields, които се съдържат в персонализирания UITableViewCell от методите на делегиране на UITextField. Предизвикателството е следното: за съжаление не мога да използвам свойството "таг", което има UITextField. Свойството "tag" се използва за нещо друго и на този етап от проекта, за съжаление, не мога да го преработя.

Например в следния метод на делегат:

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

Можете да опитате кода по-долу. Опитах го в Objective 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