Как удалить ячейку при нажатии кнопки удаления в mvvm - PullRequest
0 голосов
/ 02 мая 2018

Я перечислил данные в UITableview. Итак, я получил вывод. Вывод это список имен.

Я сделал в mvvm. Теперь мне нужно удалить ячейку, нажимая кнопку «Удалить», и мне нужно обновить таблицу.

Мой ModelView: -

class ViewModel: NSObject {
    var datasourceModel:DataSourceModel

    init(withdatasource  newDatasourceModel: DataSourceModel) {
        datasourceModel = newDatasourceModel
    }

    func datafordisplay(atindex indexPath: IndexPath) -> Model{
        return  datasourceModel.dataListArray![indexPath.row]
    }

    func numberOfRowsInSection(section:Int) -> Int {
        return (datasourceModel.dataListArray?.count)!
    }
}

мой класс модели источника данных: -

class DataSourceModel: NSObject {
    var dataListArray:Array<Model>? = []

    init(array :Array<[String:Any]>?) {
        super.init()
        var newArray:Array<[String:Any]> = []
        if array == nil {
            newArray = self.getJsonDataStored22()
        }
        else {
            newArray = array!
        }

        var datalist:Array<Model> = []
        for dict in newArray {
            let model = Model(dictionary: dict)
            datalist.append(model!)
        }
        self.dataListArray = datalist
    }
}

typealias dummyDataSource22 =  DataSourceModel
extension dummyDataSource22 {
    func getJsonDataStored22() ->Array<Dictionary<String,String>>{
            let jsonArray = [["name":"Dosa Fest"],["name":"Organic Vegan Fest"],["name":"Food Of Life Time"],["name":"Tea Time"],["name":"Dosa Fest"],["name":"Organic Vegan Fest"],["name":"Food Of Life Time"],["name":"Tea Time"]] as Array<Dictionary<String,String>>
            return jsonArray
    }
}

И мой контроллер UIView: -

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return chartViewModel.numberOfRowsInSection(section: section)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let identifier = "cell"
    var cell:ChartCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? ChartCell

    if cell == nil {
        tableView.register(UINib(nibName: "ChartCell", bundle: nil), forCellReuseIdentifier: identifier)
        cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? ChartCell
    }

    cell.setEventData(charts: chartViewModel.datafordisplay(atindex: indexPath))
    return cell
}

МОЙ UITableviewcell: -

 @IBOutlet weak var name: UILabel!

     override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    func setEventData(charts:Model) {
        self.name.text = charts.restaurantname
    }

Так что теперь, как сделать метод удаления, нажимая кнопку удаления. Что весь код должен быть добавлен в ModelView и viewController

1 Ответ

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

Обычно, в MVVM вся логика, связанная с пользовательским интерфейсом, должна быть написана в ViewModel, View или ViewController должны отображать только пользовательский интерфейс в соответствии с ViewModel и отправлять событие пользовательского интерфейса в ViewModel. когда ViewModel изменяется, он отправляет событие или уведомление, поэтому View может ответить и измениться. это называется связыванием. Точно так же viewModel должен связываться и с Model.

В вашем случае, ViewModel должен иметь метод удаления, например,

func delete(atIndex indexPath: IndexPath) {
    // model should declare modify method and viewModel should call it and observe changes too. here directly modify it for simplicity
    // you may also need to check input parameter is valid

    // now input is valid, do the change
    datasourceModel.dataListArray!.remove(at: indexPath.row)
    // and then fire a notification
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DeleteAtRow"), object: self, userInfo: ["indexPath" : indexPath])
}

чтобы представление могло передать ему событие

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        // pass delete cell event to viewModel
        chartViewModel.delete(atIndex: indexPath)
    }
}

просмотр также необходимо связать изменения

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    NotificationCenter.default.addObserver(self, selector: #selector(viewModelDeleteRows(n:)), name: NSNotification.Name(rawValue: "DeleteAtRow"), object: chartViewModel)
}

@objc func viewModelDeleteRows(n: NSNotification) {
    if let i = n.userInfo?["indexPath"] as? IndexPath {
        // respond to viewModel changes and sync UI
        self.tableView.deleteRows(at: [i], with: .automatic)
    }
}

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

var deleteCell : ((ChartCell) -> Void)?
@IBAction func clickDeleteButton(sender: UIButton) {
    deleteCell?(self)
}

и настройте ячейку

cell.deleteCell = {[weak self] in
        if let i = self?.tableView.indexPath(for: $0) {
            self?.chartViewModel.delete(atIndex: i)
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...