#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
}