Как получить доступ к объекту внутри ViewController из TableViewCell - PullRequest
1 голос
/ 23 марта 2019

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

У меня есть класс с именем userData с различными свойствами:

class UserData {
    var name: String
    var age: Int
    var credits: Int = 1
    ...

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

Внутри viewController.swift Я объявил объект этого класса:

...
var user = UserData(name: "testing", age: 5)
...

Внутри того же viewController У меня есть UITableView с несколькими UITableViewCells.В каждой ячейке есть UIStepper

Используя UIStepper из ячейки, я хочу увеличить или уменьшить свойство credits моего объекта user, которое находится внутри viewController.swift, и сделайте это из файла tableViewCell.swift

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

Дополнительная информация: Простите за произведение искусства, я не художник ...

my app image

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

Сначала белая метка сверху гласит: «0/5» (это означает, что у пользователя есть 5 доступных муравьев, но ни один из них в настоящее время не работает).

Когда пользователь увеличивает шаговый шаг для «муравьев-мусорщиков», белая метка сверху должна сказать «1/5» (это означает, что в настоящее время существует 1 муравей из 5 доступных).

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Установите эту логику в контроллерах вида 'cellForRowAt.

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

// inside cellForRowAtIndexPath:
cell.addTarget(self, action: #selector(doSomething(sender:), for: .valueChanged)

Внутри doSomething вы настроили логику для обновления вашей модели.

func doSomething(sender: UIStepper) {
    // do stuff here
}

Отредактируйте пример шаблона делегата, который был бы лучшим решением для будущих читателей.

Сначала создайте протокол:

protocol StepperCellDelegate {
    func didChangeValueForStepper(inCell: Cell, whateverInfoYouWantHere:...)
    func otherUsefulFunctions(...)
}

В своем классе ячеек установите цель / действие, когда ваше значение будет изменено:

// inside the cell's initialization (`init(style:reuseIdentifier:)`
self.addTarget(self, action: #selector(valueChanged(sender:), for: .valueChanged)

Ваша ячейка также нуждается в свойстве делегата:

weak var stepperCellDelegate: StepperCellDelegate?

doSomething будет выглядеть примерно так:

func valueChanged(sender: UIStepper) {
    stepperCellDelegate?.didChangeValueForStepper(inCell: self, ...)
}

Ваш ViewController будет реализовывать протокол

extension MyViewController: StepperCellDelegate {
    func didChangeValueForStepper(inCell: Cell, whateverInfoYouWantHere:...) {
        // implementation here
    }

    func otherUsefulFunctions(...){
        // implementation here
    }
}

А внутри cellForRowAtIndexPath установить себя в качестве делегата:

// inside cellForRowAtIndexPath:
cell.stepperCellDelegate = self
1 голос
/ 23 марта 2019

Делегирование - правильный способ справиться с этим.

Этот UItableviewCell - оба кажутся похожими - должен выставить протокол с набором методов что UIViewController может реализовать. Методы срабатывает при нажатии на виджет UIStepper.

Лучше всего придерживаться этой методологии и использовать ее везде. делает вещи легко управляемые.

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