PFTableViewCell не изменяет LabelText

#ios #parse-platform #swift #ios8

#iOS #синтаксический анализ-платформа #swift #ios8

Вопрос:

Приведенный ниже код должен принимать поле name из PFObject, передаваемого в cellForRowAtIndexPath, и устанавливать поле textLabel.text на имя (т. Е. Строка TableView потенциально может читать «sneeze1»). Я могу изменить высоту каждой строки с помощью метода heightForRowAtIndexPath, а также увидеть правильное количество вызовов cellForRowAtIndexPath (в моем конкретном случае 3 строки, загруженные в класс в браузере данных Parse) с правильными полями, но я не могу изменить textLabel.text.

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

 override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    return 60
}

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!, object: PFObject!) -> PFTableViewCell! {
    var cellIdentifier = "EventCell"

    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as? PFTableViewCell

    if !cell {
        cell = PFTableViewCell(style: .Subtitle, reuseIdentifier: cellIdentifier)
    }

    var name = object["name"] as? String
    cell!.textLabel.text = name
    println("textLabel: (cell!.textLabel.text)"   "  name: (name)")

    return cell
}
  

Комментарии:

1. возможно, вы не перезагружаете tableview.

2. Какой текст вы на самом деле видите в ячейке? ie. это работает в первый раз, а затем не может быть изменено или это просто пустое?

3. Нет, единственный текст, который я вижу, — это текст по умолчанию, указанный в используемой мной раскадровке, для которого я установил значение «Текст по умолчанию». Он просто не меняется, когда я его устанавливаю, и, как ни странно, он показывает правильное количество строк (3 в моем тестовом примере), а также позволяет мне изменять высоту строк. Я просто не могу установить textLabel.text или subtitle.

Ответ №1:

Вы должны использовать исходную подпись делегата, иначе ваш метод не будет вызван. Вместо

 override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!, object: PFObject!) -> PFTableViewCell!
  

использовать

 override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
  

Комментарии:

1. Я использую Parse.com это PFTableViewController, поэтому сигнатура метода в этом случае действительно правильная. Метод cellForRowAtIndexPath на самом деле вызывается в моем коде. Потенциально я могу попытаться не использовать Parse.com функции, позволяющие увидеть, что происходит.

Ответ №2:

Проблема в том, что as? возвращает необязательный тип, поэтому name имеет тип String? .

Попробуйте это вместо этого, если вы действительно хотите обработать отсутствующие имена:

 if let name = object["name"] as? String {
    cell!.textLabel.text = name
}
  

Комментарии:

1. Спасибо, это хороший момент, и я изменю код для обработки значений null object[«name»], но в данном конкретном случае это не поможет. Все значения object[«name»] фактически устанавливаются, когда они достигают этой части кода. Оператор println имеет значения при каждом его вызове.

Ответ №3:

Мне удалось изменить текст, когда я установил используемый UITableViewCell cellForRowAtIndexPath. Похоже, проблема в том, что PFTableViewCell от Parse потенциально смешивается с Swift. Это не позволяет мне изменять текст в PFTableViewCell.

В качестве дополнительного примечания, код работает, даже если приведенный ниже метод существует в моем PFQueryTableViewController параллельно с указанным выше PFTableViewCell cellForRowAtIndexPath. Каким-то образом код фактически просто запускает метод UITableViewCell cellForRowAtIndexPath вместо этого.

 override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    var cellIdentifier = "EventCell"

    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as? UITableViewCell

    if !cell {
        cell = UITableViewCell(style: .Subtitle, reuseIdentifier: cellIdentifier)
    }

    var name = "HELLO"//object["name"] as? String
    cell!.textLabel.text = name
    println("textLabel: (cell!.textLabel.text)"   "  name: (name)")
    //cell.imageView.file = object.objectForKey(self.imageKey) as PFFile

    return cell
}