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?), Вот как мы работали над этим:

  1. Удалить прототип ячейки из вашей раскадровки

  2. Удалить эту строку:

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

  1. Замените на эти строки кода:
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()
Другие вопросы по тегам