2nd tableview cellForRowAtIndexPath, кажется, прерывает первый

У меня есть контроллер представления таблицы с 2 представлениями таблицы. Я прошел через отладчик и просто сбит с толку. Большинство кода в cellForRowAtIndexPath не имеет значения, я думаю, но включил его на всякий случай. Число строк последовательно считывается как 9, но большую часть времени, хотя и не все, остальная часть условного in cellForRowAtIndexPath выполняется только 7 раз, в соответствии с инструкциями debugger и print. Что странно, все 9 ячеек действительно выходят, но содержимое последней ячейки будет единственной неверной информацией. Эта неправильная информация будет неправильной только в кнопке поля и содержании поля; он всегда будет считать, что содержимое поля равно нулю и имеет кнопку поля с меткой, которая идет с 0-й строкой, но его имя поля будет правильным.

Это действительно странная ошибка, которая не давала мне спать всю ночь, если я могу проснуться, чтобы получить отличный ответ от ветеринара, это действительно сделает мой день. Спасибо!

func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    if tableView == POCTableView{
        return 3
    } else{
        let ret = propertyDisplayGroups.count
        print("number of rows is (ret)")
        return ret
    }
}

@IBOutlet weak var POCTableView: UITableView!
@IBOutlet weak var friendFieldsTableView: UITableView!

var testCount = 0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == POCTableView{
        let cell = tableView.dequeueReusableCell(withIdentifier: "POCTableViewCell", for: indexPath) as! POCTableViewCell
        cell.dateDisplay.text = "12/20/15"
        cell.backgroundColor = indexPath.row % 2 == 0 ? UIColor.white : GREY_COLOR
        return cell
    } else{
        let cell = tableView.dequeueReusableCell(withIdentifier: "FriendFieldCell", for: indexPath) as! FriendFieldTableViewCell
        let propertyDisplayGroup = propertyDisplayGroups[indexPath.row]
        cell.fieldName.text = propertyDisplayGroup.fieldText
        let friendFields = friend!.fieldsDictionary
        if let fieldContent = friendFields[propertyDisplayGroup.propertyName] as? String{
            cell.fieldContent.text = fieldContent
        } else {
            cell.addFieldButton.setTitle(propertyDisplayGroup.buttonText, for: .normal)
            cell.addFieldButton.isEnabled = true
            cell.addFieldButton.isHidden = false
            cell.fieldContent.isHidden = true
        }
        testCount += 1
        print("testCount (testCount)")
        return cell
    }
}

p.s: при прохождении через отладчик 2-я таблица начнет загрузку своих строк после 7-й строки этого tableview. И 8-я строка никогда не имеет никаких проблем, несмотря на то, что она не появляется в отладчике!

1 ответ

  1. Изменение

    if tableView == POCTableView{ ... }

    к

    if tableView === POCTableView{ ... }

    === оператор в swift, который определяет, имеют ли два объекта одну и ту же ссылку.

    Ваш условный будет проверять значение tableViewпротив значения POCTableViewкоторого всегда будетfalse, если UITableViewне реализует Comparableпротокол.. а я думаю, что нет.

    Если это не ваша проблема

    Я бы посмотрел в

    if let fieldContent = friendFields[propertyDisplayGroup.propertyName] as? String{ ... }
    

    Возможно, что вы пытаетесь получить доступ к ключу, friendFieldsкоторый не существует, и в этом случае fieldContentпроизойдет сбой, и elseблок будет работать, давая неправильные данные для тех таинственных пустых ячеек, которые появляются. Что звучит как правдоподобная причина для вашей проблемы.