Доступ к представлению заголовка UITableView - PullRequest
0 голосов
/ 09 мая 2019

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

Я попытался использовать метод headerView(forSection:), и я поставил headerView(forSection: 0)! в качестве теста, чтобы убедиться, что заголовок раздела определенно существует, но каждый раз, когда я запускаю программу, строка, где метод возвращает ошибку " неожиданно обнаружен nil при развертывании необязательного значения ".

Я также пытался пометить UITextField, но когда я пытаюсь получить доступ к заголовку раздела, используя certainTableView.viewWithTag(_ tag:), и приведу полученный UIView к UITextField, в строке, где происходит приведение, возникает ошибка, говорящая «Не удалось приведите значение типа 'UITableView' к 'UITextField'. "

Обе ошибки выглядят довольно странно для меня. В первом случае я убедился, что заголовок раздела существует, но метод вернул nil. Во втором случае возвращаемое теговое представление должно иметь тип UITableViewHeaderFooterView, но тип UITableView. Может кто-нибудь подсказать какую-либо возможную причину, почему это так и как исправить?

Или, в качестве альтернативы, есть ли лучший подход для доступа к представлению заголовка раздела, чтобы я мог сохранить текст, введенный в UITextField?

Ниже приведена деталь, которую я использовал в первом случае.

В func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? я вернул UIView, который содержит UITextField. В табличном представлении, в котором мне нужно сохранить введенные пользовательские данные, у меня есть кнопка, которая, когда пользователь нажимает на нее, сохраняет данные. В этом селекторе у меня есть следующее:

//save item
    let a = addItemTableView.headerView(forSection: 0)!
    let b = a.subviews[0] as! UITextField
    let c = b.text ?? ""
    someNSManagedObject.text = c

Ошибка, о которой я упоминал выше, появляется в первой строке.

Ответы [ 3 ]

1 голос
/ 09 мая 2019

Сначала добавьте свойство к вашей модели textFieldData, чтобы сохранить данные textField в.

Затем в вашем HeaderViewClass добавьте переменную замыкания textFieldDidChange: ((String) -> Void)?

class HeaderViewClass: UITableViewHeaderFooterView {
// MARK:- IBOutlets
@IBOutlet weak var textField: UITextField!

// MARK:- Variable
var textFieldDidChange: ((String) -> Void)?

// MARK:- Functions
func fill(with model: Model) {
    textField.delegate = self
    textField.text = model.textFieldData
}
}

extension HeaderViewClass: UITextFieldDelegate {
    func textFieldDidChange(_ textField: UITextField) {    
        textFieldDidChange?(textField.text)
    }
}

По вашему мнению, класс контроллера

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: PlaceOrderFooterView.id) as! PlaceOrderFooterView
    footerView.fill(with: models[section])

    footerView.textFieldDidChange = { [unowned self] text in
        self.models[section].textFieldData = text
    }

    return footerView
}

Теперь ваш объект модели имеет обновленное значение при каждом изменении данных textField.

0 голосов
/ 09 мая 2019

Прочитав пост в этом вопросе , я получил подсказку и обнаружил, что в методе func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? я должен вернуть UITableViewHeaderFooterView вместо ранее UIView .Поскольку я изменил тип возвращаемого объекта на UITableViewHeaderFooterView, при этом все остальное осталось прежним (т.е. добавив UITextField в UITableViewHeaderFooterView), мне удалось получить доступ к UITextField в UITableViewHeaderFooterView с помощью headerView(forSection:) метода.

Чтобы быть четнымБолее ясно, учитывая в документации Apple, что объявление функции func headerView(forSection section: Int) -> UITableViewHeaderFooterView?, показывая, что возвращаемое значение - UITableViewHeaderFooterView, чтобы получить доступ к представлению заголовка, используя метод, возвращаемое значение из func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? должно быть UITableViewHeaderFooterView вместо любого другого универсальногоUIView или UIView подклассы.

Надеюсь, это поможет.

0 голосов
/ 09 мая 2019

В вашем методе

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {}

когда вы возвращаете свой пользовательский заголовок, содержащий UITextField, присваиваете его делегату вашему контроллеру, таким образом, вы получите все ключевые значения пользователем в UITextFieldDelegate function

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