Как изменить цвет и размер шрифта только для выбранной строки и для невыбранных строк, чтобы они были нормальными в представлении таблицы в Swift 3?

Здесь мне нужно сделать выбранный текст строки, чтобы увеличить шрифт, изменить цвет и сделать подчеркивание, как атрибутированный текст, и это я завершил, но здесь мне нужно выделить только выбранный текст ячейки, как с указанными выше атрибутами, и когда я нажимаю на другую строку затем мне нужно, чтобы текст оставшихся ячеек был нормальным без увеличения размера шрифта, цвета и подчеркивания, а оставшиеся ячейки были обычными. Может ли кто-нибудь помочь мне, как это реализовать?

введите здесь описание изображениявведите здесь описание изображения

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "categoriesTableCell", for: indexPath)  as! categoriesTableViewCell
    if indexPath.row == currentSelection {
        let item = categoriesModelClass?.childrenData[indexPath.row]
        cell.categoriesProductsLabel.font = UIFont(name:"Bold", size:17)
        cell.categoriesProductsLabel.textColor = UIColor.black
        let underlineAttribute = [NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue]
        let underlineAttributedString = NSMutableAttributedString(string: (item?.name)! , attributes: underlineAttribute)
        underlineAttributedString.addAttribute(NSUnderlineColorAttributeName, value: UIColor.cyan, range: NSRange(location: 0, length: (item?.name?.characters.count)!))
        cell.categoriesProductsLabel.attributedText = underlineAttributedString
    }
    else {
        let item = categoriesModelClass?.childrenData[indexPath.row]
        cell.categoriesProductsLabel.textColor = UIColor.darkGray
        cell.categoriesProductsLabel.text = item?.name
    }
    return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let previousSelection = self.currentSelection
    self.currentSelection = indexPath.row
    if previousSelection == -1 {
        let index = indexPath
        let cell = self.sideTableView.cellForRow(at: indexPath) as! categoriesTableViewCell
        let item = categoriesModelClass?.childrenData[indexPath.row]
        cell.categoriesProductsLabel.font = UIFont(name:"Bold", size:17)
        cell.categoriesProductsLabel.textColor = UIColor.black
        let underlineAttribute = [NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue]
        let underlineAttributedString = NSMutableAttributedString(string: (item?.name)! , attributes: underlineAttribute)
        underlineAttributedString.addAttribute(NSUnderlineColorAttributeName, value: UIColor.cyan, range: NSRange(location: 0, length: (item?.name?.characters.count)!))
        cell.categoriesProductsLabel.attributedText = underlineAttributedString
        sideTableView.reloadRows(at: [indexPath], with: .none)

    }else {

        let prevIndexPath = IndexPath(row: previousSelection, section: 0)
        self.sideTableView.reloadRows(at: [prevIndexPath,indexPath], with: .none)
    }

}

person User    schedule 26.12.2017    source источник
comment
Нет необходимости менять шрифт в didSelectRowAt , поскольку вы перезагружаете ячейку, это повлияет автоматически   -  person Priya    schedule 26.12.2017


Ответы (4)


Используйте этот код:

Установить цвет выделения

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
  let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath as IndexPath)!
  selectedCell.categoriesProductsLabel.font = UIFont(name:"Bold", size:17)
  selectedCell.contentView.backgroundColor = UIColor.green
}

Установить цвет выделения

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath){
    let cell:UITableViewCell = tableView.cellForRow(at: indexPath as IndexPath)!
    cell.categoriesProductsLabel.font = UIFont(name:"*Set whatever you want here*", size:14)
    cell.contentView.backgroundColor = UIColor.black
}
person User511    schedule 26.12.2017
comment
Мне нужно, чтобы после выбора строки ее нужно было выделить, как показано, что я получил, но когда я выбираю другую строку, мне нужно выделить эту строку, а ранее выбранная строка должна быть нормальной - person User; 26.12.2017
comment
Да, этот код будет работать. Пожалуйста, проверьте обновленный код. Вы можете изменить цвет по вашему выбору. - person User511; 26.12.2017

Сделайте целочисленное значение, которое представляет выбранный в данный момент индекс строки, и в cellForRowAt сделайте это

  if(index != -1 )
    {
        if(index == indexPath.row)
        {

            cell.leftLb.font = UIFont.init(name: "Helvetica", size: 50)

       }
       else
       {
          cell.leftLb.font = UIFont.init(name: "Helvetica", size: 10)

        }

    }

Когда didSelectRow щелкнул индекс обновления и перезагрузил таблицу

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{


    index = indexPath.row

    self.areaSettTable.reloadData()


}
person Sh_Khan    schedule 26.12.2017
comment
затем этот код должен быть помещен в ячейку для строки в индексном пути для обработки во время перезагрузки. - person User; 26.12.2017

попробуйте тот же код с некоторыми изменениями ниже:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "categoriesTableCell", for: indexPath)  as! categoriesTableViewCell

  if indexPath.row == currentSelection {

  let item = categoriesModelClass?.childrenData[indexPath.row]
  cell.categoriesProductsLabel.font = UIFont(name:"Bold", size:17)
  cell.categoriesProductsLabel.textColor = UIColor.black
  let underlineAttribute = [NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue]
  let underlineAttributedString = NSMutableAttributedString(string: (item?.name)! , attributes: underlineAttribute)
  underlineAttributedString.addAttribute(NSUnderlineColorAttributeName, value: UIColor.cyan, range: NSRange(location: 0, length: (item?.name?.characters.count)!))
  cell.categoriesProductsLabel.attributedText = underlineAttributedString

  }else {

   let item = categoriesModelClass?.childrenData[indexPath.row]
   cell.categoriesProductsLabel.textColor = UIColor.darkGray
   cell.categoriesProductsLabel.font = UIFont(name:"Bold", size:10)
   cell.categoriesProductsLabel.text = item?.name

}
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.currentSelection = indexPath.row
    self.sideTableView.reloadData()

}
person Shezad    schedule 27.12.2017
comment
если я выбираю одну ячейку табличного представления, то выбранная метка отлично работает с моим опубликованным кодом, но когда я меняю направление выбора ячеек, она не работает должным образом @Shezad - person User; 27.12.2017

Инициализируйте переменную, которая содержит текущий выбор, с -1, затем, когда выбрана ячейка, установите номер строки в качестве ее значения. Перезагрузить только предыдущий выбор и текущую ячейку выбора. Нет необходимости перезагружать всю таблицу

let arrData:[String] = ["Woman's Clothing","Men's Clothing","Bags","Beauty","Sports","Shoes"]
var currentSelection = -1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return self.arrData.count

}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
    cell?.textLabel?.text = self.arrData[indexPath.row]
    if indexPath.row == currentSelection {

        cell?.textLabel?.textColor = UIColor.blue //Apply font, color for selected cell
    }else {

        cell?.textLabel?.textColor = UIColor.black //Apply font, color for non selected cell
    }
    return cell!
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let previousSelection = self.currentSelection
    self.currentSelection = indexPath.row
    if previousSelection == -1 {

        self.tableView.reloadRows(at: [indexPath], with: .none)

    }else {

        let prevIndexPath = IndexPath(row: previousSelection, section: 0)
        self.tableView.reloadRows(at: [prevIndexPath,indexPath], with: .none)
    }
}
person Priya    schedule 26.12.2017
comment
Какова цель этой логики? - person User511; 26.12.2017
comment
но это не работает в конкретной ситуации @Priya - person User; 26.12.2017
comment
Я не могу понять проблему, увидев изображение. Не могли бы вы уточнить проблему? - person Priya; 26.12.2017
comment
когда я нажимаю один за другим, он работает отлично, но когда я нажимаю последовательно, размер шрифта не меняется на нормальный, просто посмотрите на мое изображение @Priya - person User; 26.12.2017
comment
здесь я отредактировал свой код, просто проверьте, что он терпит неудачу, когда вы нажимаете последовательно, например, после выбора первой строки щелкните третью или четвертую строку, затем происходит сбой @Priya - person User; 26.12.2017
comment
см. на моем изображении разные размеры шрифта текста ячейки @Priya - person User; 26.12.2017
comment
Вы установили нормальный размер шрифта в другой части? - person Priya; 26.12.2017
comment
но когда я щелкаю по одной строке, она устанавливается автоматически, но не работает, когда я делаю последовательно - person User; 26.12.2017
comment
cell.categoriesProductsLabel.font = UIFont(name:"Bold", size:17), поскольку вы установили это как выбранную ячейку в другой части места cell.categoriesProductsLabel.font = UIFont(name:"Normal", size:17) или что вам нужно, как невыбранный текстовый шрифт - person Priya; 26.12.2017