Невозможно установить переменную в UITableViewCell из родительского ViewController - PullRequest
0 голосов
/ 07 мая 2018

У меня есть UITableView и пользовательский класс TableViewCell, я устанавливаю ненулевое значение в методе viewDidLoad, но при установке значения в UITableViewCell в методе cellForRow значение магическим образом становится равным нулю. Я не могу получить доступ к переменной из моего пользовательского UITableViewCell Вот фрагмент кода. Оператор print в ViewDidLoad печатает значение, в то время как значение в cellForRowAtIndexPath возвращает nil

override func viewDidLoad() {
    super.viewDidLoad()
    Docco360Util.shared().getDoctorsWithResultBlock { (doctorObjects, error) in
        if let err = error{
            print(err)
        }else{
            self.doctors=doctorObjects
            print(doctorObjects![1].professionalHeader)//output is printed here
            self.doctorTableView.reloadData()
        }
    }

    // Do any additional setup after loading the view.
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let identifierForUsers = "DoctorTableViewCell"
    var cell = tableView.dequeueReusableCell(withIdentifier: identifierForUsers, for: indexPath) as! DoctorTableViewCell
    if cell == nil{
        cell=DoctorTableViewCell(style: .default, reuseIdentifier: identifierForUsers)
    }
    print(self.doctors[indexPath.row].professionalHeader)//output in nil here
    cell.doctor=self.doctors[indexPath.row]
    return cell
}

Ответы [ 3 ]

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

Во-первых, вы должны убедиться, что закрытие Docco360Util.shared().getDoctorsWithResultBlock выполняется в основном потоке (UI). Если нет, вы должны поместить его в блок DispatchQueue.main.async.

Затем вы должны убедиться, что результирующий блок выполнен (например, оператор print что-то печатает). Кстати, почему вы звоните print(doctorObjects![1].professionalHeader) с индексом 1, а не 0? В tableView(tableView:cellForRowAt:) элемент с индексом 0 - может быть, это doctor равно nil?

Вы могли бы начать с установки точки останова в объявлении своего свойства, в качестве точки наблюдения, или реализовать наблюдатель свойства (willSet) и добавить ее точку останова, чтобы проверить, не мешает ли кто-то вашим переменным.

Если все это не помогает, вы можете разместить больше кода, особенно все строки кода, в которые вы пишете массив self.doctors.

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

Я мог бы наконец-то это исправить. Проблема была в объявлении переменных. Я использовал заголовочный файл Objective-C для объявлений. Объявляя, я объявил их «слабыми» вместо «сохранить», и это стало причиной проблемы.

0 голосов
/ 07 мая 2018
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "DoctorTableViewCell", for: indexPath) as! DoctorTableViewCell

    print(self.doctors[indexPath.row].professionalHeader)
    cell.doctor = self.doctors[indexPath.row]
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...