Обмен и перезагрузка данных в tableView для другого объекта Realm - PullRequest
0 голосов
/ 15 мая 2018

Проблема Я хочу разрешить пользователям нажимать «своп» в ячейке таблицы и затем находить другой объект Realm, чтобы заполнить 2 текстовые метки (для имени упражнения и числа повторений) в ячейке с помощьюзначения из нового объекта.

Исследования Существует довольно много (по общему признанию, старых) "движущихся строк" (например, здесь Как поменять две пользовательских ячейки друг с другом в табличном представлении? ), а также здесь ( UITableView подкачки ячеек ), а затем очевидно, что многое перезагружает данные само по себе, но я ничего не могу найти в этом случае использования.

Что я пробовал мой код ниже отлично работает для получения нового объекта.то есть в ячейке есть некоторые данные, а затем, когда вы нажимаете кнопку «swapButton», она получает еще одну, готовую для вставки в tableView.Я знаю, как перезагрузить данные в целом, но не внутри одной конкретной ячейки in situ (ячейка, к которой принадлежит определенная кнопка обмена ... в каждой ячейке есть «кнопка обмена»).

Полагаю, мне нужнокаким-то образом найти indexRow 'swapButton' и затем получить доступ к свойствам ячейки этой конкретной ячейки, но не уверен, с чего начать (я поиграл с несколькими вариантами, но я просто догадываюсь, так что это не работает!)

class WorkoutCell : UITableViewCell {

    @IBOutlet weak var exerciseName: UILabel!
    @IBOutlet weak var repsNumber: UILabel!
    @IBAction func swapButtonPressed(_ sender: Any) {
        swapExercise()
    }

    func swapExercise() {

        let realmExercisePool = realm.objects(ExerciseGeneratorObject.self)
        func generateExercise() -> WorkoutExercise {
            let index = Int(arc4random_uniform(UInt32(realmExercisePool.count)))
            return realmExercisePool[index].generateExercise()
        }

    }
//do something here like cell.workoutName 
//= swapExercise[indexRow].generateExercise().name??? 
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Решение от OP Я адаптировал код здесь Как получить доступ к содержимому пользовательской ячейки в быстром режиме с помощью тега кнопки?

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

Надеюсь, это поможет другим с такой же проблемой!

0 голосов
/ 15 мая 2018

Держите ваши объекты где-нибудь в VC, который показывает UITableView.Затем добавьте VC как цель, чтобы поменять местами кнопку.Реализуйте обмен объектами при нажатии кнопки и перезагрузите данные табличного представления после.Вся идея состоит в том, чтобы переместить логику для просмотра контроллера, а не в отдельной ячейке.

Есть 2 способа.1. Добавление VS в качестве цели действия кнопки.

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = ... // get cell and configure it
    cell.swapBtn.addTarget(self, action: #selector(swapTapped(_:)), for: .touchUpInside)
    return cell
}

func swapTapped(_ button: UIButton) {
    let buttonPosition = button.convertPoint(CGPointZero, toView: self.tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(buttonPosition)!
    // find object at that index path
    // swap it with another
    self.tableView.reloadData()
}

Сделать VC делегатом ячейки.Больше кодаЗдесь вы создаете протокол в ячейке и добавляете переменную делегата.Затем, когда вы создаете ячейку, вы назначаете VC в качестве делегата для ячейки:

public func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell = ... // получить ячейку и настроитьit cell.delegate = self return cell}

func swapTappedForCell (_ cell: SwapCell) {// та же логика для замены}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...