#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
делает.
Надеюсь, это вам поможет.