Делегирование ноль, MVVM подход, два VC имеют одинаковую виртуальную машину. iOS, swift - PullRequest
1 голос
/ 25 октября 2019

Существует базовый класс, соответствующий ViewModelInsertProtocol с функцией insertToCollection(). delegate устанавливается в self в методе viewDidLoad класса CollectionViewController.

class CollectionViewController: UIViewController, ViewModelInsertProtocol {


func insertToCollection() {
    print("asdasd")
    collection.performBatchUpdates({
                     collection.insertItems(at: [IndexPath(row: viewModel.notes.count - 1, section: 0)])
                 }, completion: nil)
}


//MARK: -Variables

let reuseIdentifier = "cell"
var isEdit = false
var isSettingsEdit = false
var viewModel  = ViewModel()


//MARK: -OUTLETS

@IBOutlet var mainView: UIView!
@IBOutlet weak var bacgroundImageView: UIImageView!
@IBOutlet weak var collection: UICollectionView!
@IBOutlet weak var addButton: UIButton!
@IBOutlet weak var sideViewConstraint: NSLayoutConstraint!
@IBOutlet weak var settingConstraint: NSLayoutConstraint!
@IBOutlet weak var sideView: UIView!
@IBOutlet weak var icon: UIButton!
@IBOutlet weak var settingButton: UIButton!
@IBOutlet weak var backgr: UIButton!
//MARK: - LifeCycle

override func viewDidLoad() {
    super.viewDidLoad()


    configureUI()
    viewModel.delegate = self
 }

Если я хочу добавить новый UICollectionCell, мне нужно перейти к другому popVC PopVC, и у моего Baseclass есть экземплярыviewModel

var viewModel = ViewModel () Я использую одну и ту же viewModel для обоих классов, посмотрите на SaveBtn здесь, в PopVC, в этом месте я использую метод делегата.

var viewModel = ViewModel()


//MARK: -Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()

    configure()
    addObservers()
    viewModel.popDelegate = self


}
override func viewWillDisappear(_ animated: Bool) {
    viewModel.editSelected = false
}

func configure() {
    saveBtnOutlet.visualButton()
    xBtnOutlet.visualButton()
    cancelBtnOutlet.visualButton()
    firstCardColor.visualButton()
    secondCardColor.visualButton()

}


   @IBAction func CancelBtn(_ sender: Any) {
       dismiss(animated: true, completion: nil)
   }

   @IBAction func saveBtn(_ sender: Any) {

    viewModel.saveData(text: textF.text)
    dismiss(animated: true, completion: nil)

   }


rotocol ViewModelInsertProtocol: class {
func insertToCollection()
}

  extension ViewModel {

func numberOfRows() -> Int {
    return notes.count
}

}

class ViewModel {

var notes: Results<Model> {
    get{
        return realm.objects(Model.self)
    }
}
weak var delegate : ViewModelInsertProtocol? = nil
weak var popDelegate: PopDelegate? = nil
var backgroundImageIndex = 0
var editSelected = false
let realm = try! Realm()

var size = Sizes.largeSize
var background: String = "wood"

func saveData(text: String) {
    let newcard = Model()
    newcard.note = text
    RealmSerivce.shared.create(newcard)
    print(notes.count)
    if delegate == nil {print("nil")}
    delegate?.insertToCollection()

}

Что не такс этим кодом?

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Следуя MVVM-подходу и внедрению зависимостей, вы можете внедрить вашу ViewModel вместо создания нового экземпляра в вашем поп-контроллере, например, при подготовке к переходу, если вы используете раскадровку:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "PopVcIdentifier" {
        let popController = segue.destination as? PopVC
        popController?.viewModel = viewModel
    }
}

Или в функции showPopUp:

func showPopUp() {
    let popController = PopVC()
    popController.viewModel = viewModel
    present(popController, animated: true)
}
0 голосов
/ 25 октября 2019

Я обнаружил две следующие проблемы в моем приложении. 1. Я пытаюсь сделать то же самое, что и в первой задаче, чтобы не вставлять новую ячейку, а скорее удалить ячейку, и для этого я создал протокол в PopVC, согласовал его в BaseClass и установил делегат в prepareForSegueMethod. Это прекрасно работает для первой задачи. Я имею в виду для cellInsert, но не работает для удаления. Разница в том, что когда я хочу удалить свою ячейку, я попадаю в PopVC с помощью didSelectItemAtIndexPath, в случае вставки я использую кнопку «плюс». Нужно ли устанавливать делегирование для ячейки в didSelectItemAtIndexPah?

2 Проблема с выделением ячейки: я не могу выбрать первую ячейку в моем collectionView, в didselectItemForIndePath я использую метод print (indexPath.row). Проблема в том, что этот отпечаток показывает мне неправильный ряд. Если я выберу, например, вторую строку, print покажет мне 1 или 3 строки. один раз он печатает «1», другой раз «0», другой раз «5» Знаете, может быть, что здесь происходит?

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