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

У меня есть собственное табличное представление.

class CustomCell: UITableViewCell {

var firstBtn  : UIButton!
var secondBtn : UIButton!

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    // button frame coding
    self.contentView.addSubview(firstBtn)
    self.contentView.addSubview(secondBtn)
}

В контроллере представления я создал табличное представление программно.

colorTableView.frame = CGRectMake(20,50,100, 200)
colorTableView.delegate = self
colorTableView.dataSource = self
colorView.addSubview(colorTableView)

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

Мне нужно оставаться выбранной ячейкой до перехода к следующей ячейке.

И я попытался исправить это, вручную задав фоновый цвет следующим образом, но это не сработало, как я хотел.

Cell?.contentView.backgroundColor = UIColor.lightGrayColor()
Cell?.textLabel?.backgroundColor = UIColor.clearColor()

Cellforindexpath

           func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell


            cell.contentView.addSubview(cell.firstbutton)

        cell.firstbutton.addTarget(self, action: "buttonpress:", forControlEvents: UIControlEvents.TouchUpInside)
       }

person Lydia    schedule 03.07.2015    source источник
comment
Вам нужно изменить цвет ячейки в didSelect: метод делегата UITableView. Когда вы выбираете ячейку, измените ее цвет фона в этом методе.   -  person Amit89    schedule 03.07.2015
comment
Я не хочу менять цвет. Мне нужно получить цвет выбранной ячейки по умолчанию, пока он не перейдет в другую ячейку.   -  person Lydia    schedule 03.07.2015
comment
Вам нужно создать переменную NSIndexPath как currentSelectedIndex, а в didSelect вам нужно проверить, отличается ли параметр метода indexPath от currentSelectedIndex, и внести изменения на его основе.   -  person Amit89    schedule 03.07.2015
comment
Если вы можете дать мне код, значит, будет полезно   -  person Lydia    schedule 03.07.2015


Ответы (4)


Вот решение.

Создайте переменную типа - var currentSelectedIndex: NSIndexPath!

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
      if self.currentSelectedIndex != indexPath {
            let previosSelectedCell = tableView.cellForRowAtIndexPath(self.currentSelectedIndex) as! UITableViewCell
            selectedCell.backgroundColor = UIColor.clearColor()
            self.currentSelectedIndex = indexPath
            let selectedCell = tableView.cellForRowAtIndexPath(indexPath) as! UITableViewCell
            selectedCell.backgroundColor = UIColor.redColor()
        }
}
person Amit89    schedule 03.07.2015
comment
currentSelectedIndex, где я могу инициализировать в делегате cellforindexpath? - person Lydia; 03.07.2015
comment
В контроллере представления, где существует таблица. Цвета я взял случайно, вы должны использовать желаемый цвет. - person Amit89; 03.07.2015
comment
Это нормально. Я спрашиваю, где хранится это значение, например: currentselIndex =. Понятно, где значение обновлено. - person Lydia; 03.07.2015
comment
Это придает цвет ячейке. Но когда я нажимаю кнопку в той же ячейке, цвет исчезает. - person Lydia; 03.07.2015

  1. Например, напишите пользовательскую функцию для своей кнопки (используйте кнопку в качестве отправителя)

  2. Ваша функция кнопки:

    func buttonpress(sender: UIButton) {
    // get the cell and table
        var cell: UITableViewCell = sender.superview.superview as UITableViewCell
        var tableView: UITableView = cell.superview as UITableView
        let rowToSelectIndexPath = tableView.indexPathForCell(cell)
        tableView.selectRowAtIndexPath(rowToSelectIndexPath, animated: true, scrollPosition:UITableViewScrollPosition.None)
    }
    
person derdida    schedule 03.07.2015
comment
ошибка: не удалось привести значение типа «UITableViewWrapperView» к «UITableView» - person Lydia; 03.07.2015
comment
Я не знаю вашего точного макета — с .superview вы переходите к родительскому контейнеру — проверьте свою сцену (и, возможно, вам нужно несколько .superview) —> сначала проверьте, в порядке ли ячейка (распечатайте любое значение ячейки после var cell: ....) - person derdida; 03.07.2015

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

person Gopal Devra    schedule 03.07.2015

С Божьей благодатью, наконец, я нашел решение.

Первый шаг: сохраните индексный путь выбранной строки

   func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
    println("row selected")
    GetIndexOfRow = indexPath

    return GetIndexOfRow
}

Затем в методе cellForAtIndexPath:

          if getIndexpathOfRow != nil {
        if indexPath ==  getIndexpathOfRow {
            cell.contentView.backgroundColor = UIColor(white: 0.85, alpha: 1)
            cell.textLabel?.backgroundColor = UIColor(white: 0.85, alpha: 1)

        }else {
            cell.contentView.backgroundColor = UIColor.whiteColor()
            cell.textLabel?.backgroundColor = UIColor.whiteColor()
        }

    }

Это дает выбор строки со светло-серым цветом в качестве цвета выбора по умолчанию для ячейки таблицы.

      for view in self.view.subviews {
        for each in view.subviews {

            if each.isKindOfClass(UITableView){
                var getTableview = each as! UITableView

                for (var j = 0; j < getTableview.numberOfSections(); ++j)
                {
                    for (var i = 0; i < getTableview.numberOfRowsInSection(j); ++i)
                    {

                                                                                var cells =  getTableview.cellForRowAtIndexPath(NSIndexPath(forRow: i, inSection: j))

                        if cells?.textLabel?.backgroundColor  == UIColor(white: 0.85, alpha: 1.0) {
                        cells?.contentView.backgroundColor = UIColor.whiteColor()
                        cells?.textLabel?.backgroundColor = UIColor.whiteColor()
                        }



                    }
                }


            }
        }


    }

Вышеприведенный код работает следующим образом. Когда мы выбираем строку, она проверяет видимый цвет ячейки фона ячейки. Если какая-либо другая ячейка имеет цвет, это означает. Изменен на чистый цвет (в моем случае белый цвет). Таким образом, мы можем видеть только выделение выбранной ячейки. .

Этого достаточно, чтобы ячейка подсветилась, если даже работают внешние кнопки или кнопка в ячейке.

Надеюсь, это поможет кому-то.

person Lydia    schedule 07.07.2015