Изменить UILabel на selectedRow

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Я пытаюсь изменить цвет метки ячейки в выбранном TableView. Я пытаюсь достичь этого с помощью следующего кода:

 TextLabel.HighlightedTextColor = UIColor.White;
  

К сожалению, это не сработает и сохранит его первоначальный цвет, который я заполнил из раскадровки.

Я предоставлю изображение полного кода. Синий цвет фона работает, но цвет метки — нет.

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

Редактировать

Я пытаюсь изменить состояние кнопки в зависимости от того, выбрана ли строка да или нет. Когда выбрана строка, я хотел бы показать кнопку внизу (за пределами TableView), которая будет отображаться (IsEnabled = true), когда у меня нет выбранных строк, я хочу, чтобы для нее было установлено значение disabled (IsEnabled = false. Как я могу справиться с этим наилучшим образом?

В настоящее время у меня есть следующая логика, но это приведет к сбою с кодом ошибки: Поток 1: EXC_BREAKPOINT (code = 1, subcode = 0x100044e70)

Когда я выбираю строку и отменяю выбор той же строки, приложение завершает работу.

Код:

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

        let selectedCell = tableView.cellForRow(at: indexPath)
        selectedCell?.contentView.backgroundColor = UIColor(red: 84.0 / 255, green: 199.0 / 255, blue: 252.0 / 255, alpha: 1)
        self.checkButtonAvailability()
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let selectedCell = tableView.cellForRow(at: indexPath)
        selectedCell?.textLabel?.textColor = UIColor.darkGray
        self.checkButtonAvailability()
    }
    @IBAction func nextBtnPressed(_ sender: AnyObject) {
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }

    func checkButtonAvailability() {
        if (self.tableView.indexPathsForSelectedRows?.count)! > 0 {
            nextBtn.isEnabled = true
            nextBtn.backgroundColor = UIColor(red: 84.0 / 255, green: 199.0 / 255, blue: 252.0 / 255, alpha: 1)
        } else {
            nextBtn.isEnabled = false
            nextBtn.backgroundColor = UIColor.darkGray
        }   
    }
  

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

1. Пожалуйста, не размещайте код в виде изображения. Пожалуйста, скопируйте и вставьте фактический код в свой вопрос. Это значительно упрощает чтение и ссылки при ответе.

2. Речь идет о textLabel. Выделенный текстовый цвет = UIColor. Белый

3. Это не меняет того факта, что вы не должны размещать код в виде изображения.

4. Изображение — это просто материал для котельной плиты, и оно предназначено для того, чтобы сделать его более понятным для других. Им это не нужно, чтобы решить мою проблему.

5. И еще раз, это не меняет того факта, что вы не должны размещать код в виде изображения. Пожалуйста, никогда не публикуйте код в виде изображения по какой-либо причине. Это трудно читать и ссылаться. И если это не нужно, то не публикуйте его ни в какой форме.

Ответ №1:

Подкласс вашего UITableViewCell и установите его там:

 class YourTableViewCell: UITableViewCell
{

    @IBOutlet weak var myLabel: UILabel!

    override func setSelected(_ selected: Bool, animated: Bool) {
        if(selected) {            
            self.myLabel.textColor = UIColor.white
        } else {
            self.myLabel.textColor = UIColor(red: 84.0/255.0, green: 199.0/255.0, 252.0/255.0)
        }
    }      
}
  

Тогда ваш cellForRow метод может выглядеть следующим образом:

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

    let cell = ... as! YourTableViewCell 

    ...
    /// you don't need to set the highlight color here. 
}
  

Если вы хотите отслеживать доступность кнопки, используйте общедоступную переменную Bool, подобную этой (вне методов):

 var someRowSelected = false
  

Затем реализуйте какой-то метод проверки:

 func checkButtonAvailability() {
    if self.tableView.indexPathsForSelectedRows?.count > 0 {
        myButton.isEnabled = true
    } else {
        myButton.isEnabled = false
    }   
}
  

Затем в ваших didSelectRow методах и didDeselectRow методах делегирования вы можете вызвать этот метод:

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   self.checkButtonAvailability()
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
       self.checkButtonAvailability()
}
  

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

1. почему это на самом деле не работает в стандартной функции didSelectRow в indexPath?

2. Я полагаю, что слишком поздно делать это в методе didSelectRow, поскольку строка уже выбрана. Но если вы попытаетесь сделать это раньше, вы можете добиться успеха. Попробуйте ввести свою строку в cellForRow (поскольку свойство .HighlightedTextColor — это просто определение, а не принуждение метки к изменению ее стиля). Я еще не пробовал это.

3. спасибо, сэр. Теперь, когда я выбираю строку, я хочу, чтобы кнопка была доступна, а когда строка не выбрана, я хочу, чтобы она была отключена. Как я могу справиться с этим наилучшим образом? Потому что я не могу перетащить выход кнопки, конечно, пользовательский класс ячейки.

4. @GiorgioE Когда выбрана строка, я хотел бы показать кнопку внизу (за пределами TableView), которая будет отображаться (IsEnabled = true), когда у меня нет выбранных строк, я хочу, чтобы для нее было установлено значение disabled (IsEnabled = false. Как я могу справиться с этим наилучшим образом?

5. @KevinVugts я обновил ответ. Попробуйте. Но на самом деле это новый вопрос, пожалуйста, подумайте о создании нового. Удачи!

Ответ №2:

Если вы хотите изменить цвет метки, вы должны изменить:

 selectedCell.textLabel?.HighlightedTextColor = UIColor.white
  

Для:

 selectedCell.textLabel.textColor = UIColor.white
  

Это потому HighlightedTextColor , что не меняет цвет вашей метки.

// свойство ‘highlight’ используется подклассами для таких вещей, как нажатые состояния. полезно сделать его частью базового класса в качестве пользовательского свойства

Это то, что HighlightedTextColor делает.

Надеюсь, это вам поможет.