UITableViewCell не показывает detailTextLabel.text - Swift
Подробный (подзаголовок) текст не появляется. Однако данные доступны, потому что при добавлении вызова println() он выводит Optional("data") на консоль с ожидаемыми данными. В раскадровке для UITableViewController установлен правильный класс, для стиля ячейки табличного представления установлено значение "Субтитры", а для идентификатора повторного использования - "ячейка". Как я могу получить информацию о субтитрах для отображения?
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
dispatch_async(dispatch_get_main_queue(), { () -> Void in
cell.textLabel.text = self.myArray[indexPath.row]["title"] as? String
cell.detailTextLabel?.text = self.myArray[indexPath.row]["subtitle"] as? String
println(self.myArray[indexPath.row]["subtitle"] as? String)
// The expected data appear in the console, but not in the iOS simulator's table view cell.
})
return cell
}
13 ответов
Та же проблема здесь (из того, что я читал, возможно, ошибка в iOS 8?), Вот как мы работали над этим:
Удалить прототип ячейки из вашей раскадровки
Удалить эту строку:
var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
- Замените на эти строки кода:
let cellIdentifier = "Cell" var cell = tableView.dequeueReusableCellWithIdentifier (cellIdentifier) как? UITableViewCell если ячейка == ноль { cell = UITableViewCell(стиль: UITableViewCellStyle.Value2, reuseIdentifier: cellIdentifier) }
Обновление для Swift 3.1, версия Xcode 8.3.3:
let cellIdentifier = "Cell"
var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.value2, reuseIdentifier: cellIdentifier)
}
Ваш код выглядит хорошо. Просто перейдите на раскадровку и выберите ячейку вашего табличного представления -> Теперь перейдите к Инспектору атрибутов и выберите стиль для Субтитров.
Следуйте этому согласно скриншоту ниже.
Надеюсь, это помогло..
Если вы все еще хотите использовать прототипную ячейку в раскадровке, выберите стиль TableViewcell как Subtitle. это будет работать.
Попробуйте это у меня работает (swift 4.2)
let cell = UITableViewCell(style: .value1, reuseIdentifier: "cellId")
Цель c:
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellId"];
Если делать это программно без ячеек в конструкторе интерфейса, этот код работает как прелесть в Swift 2.0+
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
yourTableView.delegate = self
yourTableView.dataSource = self
yourTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "subtitleCell")
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return yourTableViewArray.count
}
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell: UITableViewCell = yourTableView.dequeueReusableCellWithIdentifier("subtitleCell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = "the text you want on main title"
cell.detailTextLabel?.text = "the text you want on subtitle"
return cell
}
Если вы устанавливаете текст на ноль где-то, когда вы пытаетесь установить его на ненулевое значение, фактическое представление, содержащее текст, будет отсутствовать. Это было введено в iOS8. Попробуйте установить пустое место @" "
персонаж вместо
Смотрите это: Субтитры UITableViewCell не будут обновляться
Для чего это стоит: у меня была проблема детализации, не появляющаяся. Это потому, что я зарегистрировал ячейку tableView, чего не следовало делать, поскольку прототип ячейки был определен непосредственно в раскадровке.
В Xcode11 и Swift5 мы должны поступить так, как показано ниже. Если мы сделаем это, проверив условие cell == nil, а затем создав UITableViewCell с cellStyle, он не будет работать. Ниже решение работает для меня.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: cellIdentifier)
cell?.textLabel?.text = "Title"
cell?.detailTextLabel?.text = "Sub-Title"
return cell!
}
Вот как это работает для Swift 5, чтобы получить субтитры с помощью detailtextlabel, используя объект UITableView в контроллере представления, если вам не хватает любого из них, он не будет работать и, вероятно, выйдет из строя.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
В viewDidLoad:
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "subtitleCell")
Функция делегата:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Fetch a cell of the appropriate type.
let cell = UITableViewCell(style: .subtitle , reuseIdentifier: "subtitleCell")
// Configure the cell’s contents.
cell.textLabel!.text = "Main Cell Text"
cell.detailTextLabel?.text = "Detail Cell Text"
return cell
}
Xcode 11
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "reuseIdentifier")
cell.detailTextLabel?.text = "Detail text"
cell.textLabel?.text = "Label text"
// Configure the cell...
return cell
}
Некоторые из приведенных выше решений не совсем верны. Так как ячейку нужно использовать повторно, а не создавать заново. Вы можете изменить метод инициализации.
final class CustomViewCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .value1, reuseIdentifier: reuseIdentifier)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
В следующем выпуске будут объявлены устаревшими три свойства:
imageView
textLabel
и
detailTextLabel
Вы можете использовать
UIListContentConfiguration
настроить ячейку
dataSource = UITableViewDiffableDataSource(tableView: tableview, cellProvider: { tableview, indexPath, menu in
let cell = tableview.dequeueReusableCell(withIdentifier: self.profileCellIdentifier, for: indexPath)
var content = cell.defaultContentConfiguration()
content.text = menu.title
if indexPath.section == MenuSection.info.rawValue {
content.image = UIImage(systemName: "person.circle.fill")
content.imageProperties.tintColor = AppColor.secondary
}
if let subtitle = menu.subTitle {
content.secondaryText = subtitle
}
cell.contentConfiguration = content
return cell
})
Swift 5 с текстом субтитров, здесь не нужно регистрировать свою ячейку в viewDidLoad:
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if cell == nil {
cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")
}
cell?.textLabel?.text = "title"
cell?.textLabel?.numberOfLines = 0
cell?.detailTextLabel?.text = "Lorem ipsum"
cell?.detailTextLabel?.numberOfLines = 0
return cell ?? UITableViewCell()