Вызвать метод UITableViewCell из метода в основном VC?

Я пытаюсь сделать противоположное тому, что просят большинство людей в этой теме. Большинство людей хотят, чтобы кнопка в ячейке табличного представления вызывала метод в их таблице VC/VC. У меня уже есть протокол, делающий это.

Проблема/вопрос

Сейчас я пытаюсь добавить обратное: мне нужно нажать кнопку на моем основном ViewController (в котором находится моя таблица), чтобы вызвать метод в моем классе CusomTableViewCell (примечание: кнопка, нажатая на основном VC, не находится в таблице) . У меня создан класс протокола и написана функция, но я не знаю, как установить CustomCellViewClass в качестве делегата. Когда я сделал наоборот, я вставил cell.delegate = self в метод cellForRowAtIndexPath. Я также использовал prepareForSegue для назначения делегата. Но без перехода и теперь с методом создания ячеек я потерялся!

Пример желаемой функции

Моя конечная цель состоит в том, что нажатие кнопки в основном VC изменит название кнопки в ячейках. Простым примером может быть то, что у меня есть одно представление с одной таблицей, при нажатии кнопки содержимое таблицы переключается между двумя массивами, автомобилями и мотоциклами. Когда в таблице показаны автомобили, все заголовки кнопок ячеек должны выглядеть так: «Смотрите внутрь», но при отображении кнопки мотоцикла они должны читаться «Смотрите ближе».

Код

Я уже написал функцию, которую я хочу, чтобы ячейка выполняла:

func cellButton_Title_Switch (currentList: String) {
    if vcState == "cars" {
        cellButton.setTitle("Look inside", forState: UIControlState.Normal)
    }
    else {
        cellButton.setTitle("Look closer", forState: UIControlState.Normal)
    }
}

Я создал протокол:

protocol delegateToChangeCellBut {
    func cellButton_Title_Switch (currentList: String)
}

У меня есть self.delegate.cellButton_Title_Switch(currentList) в моей кнопке VC, и протокол добавлен в объявление моего пользовательского класса ячеек. Но как мне сделать эту последнюю недостающую часть в пользовательском классе ячеек, где я назначаю класс делегату?


person Dave G    schedule 24.08.2015    source источник
comment
как кнопка нажимается? как в каком методе viewController это нажато? сделалselectRowatindexpath?   -  person Larry Pickles    schedule 24.08.2015
comment
Только что понял. Мне вообще не нужен протокол. Когда кнопка нажата, я переключаю массивы... поэтому мне нужно перестроить таблицу. Это означает, что cellForRowAtIndexPath будет запускаться и перестраивать каждую ячейку. Поскольку cellForRowAtIndexPath дает мне возможность получить доступ к моему контроллеру представления CustomTableViewCell, я могу вызвать функцию прямо в cellForRowAtIndexPath. После нескольких часов возни с протоколами я понял, что на это нужно всего 5 минут. Если никто не ответит до того, как мой блок ответов закончится, я отвечу на свой вопрос, лол. Я не хочу удалять пост на тот случай, если кто-то еще будет таким же вялым, как я.   -  person Dave G    schedule 24.08.2015
comment
да, я как раз собирался опубликовать решение, рад, что вы его поняли, это отлично   -  person Larry Pickles    schedule 24.08.2015


Ответы (1)


Моя первоначальная проблема заключалась в том, что в ячейке моего UITableView есть кнопки и метки, некоторые из которых меняются, чтобы соответствовать состоянию вещей вне таблицы, вещам, обрабатываемым mainViewController.

Пользовательская ячейка определяется customCellviewController. Все кнопки и метки пользовательских ячеек имеют свои IBOutlets, подключенные к customCellviewController. Я не мог понять, как сделать действие/изменение вне таблицы (в mainViewController), чтобы немедленно изменить метки ячеек и кнопки.

Примечание. Протоколы, как правило, работают наоборот (действие ячейки запускает функцию в mainVC). Я не мог понять, как использовать протокол для решения этой проблемы. К счастью, решение оказалось намного проще, чем протокол.

Решение!

Я написал метод updateCell, который меняет метки и кнопки, и теперь этот код находится в customCellviewController. Затем я вызвал/запустил функцию «updateCell» из mainViewController, просто добавив вызов в мою функцию cellForRowAtIndexPath. Так это выглядит примерно так:

var stateOfPage = "Green"

//Creates the individual cells. If the above function returns 3, this runs 3 times
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    //Setup variables
    let cellIdentifier = "BasicCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! customCell

    cell.updateCell(stateOfPage)

    return cell
}

Теперь приведенный выше код/метод запускается при построении таблицы. Итак, чтобы обновить ячейки, нажмите кнопку или выполните другое действие, чтобы перезагрузить данные таблицы:

tableView.reloadData()

Удачи.

person Dave G    schedule 27.08.2015