委派为零,MVVM方法,两个VC具有相同的VM.iOS,swift



有一个基类符合ViewModelInsertProtocol,函数为insertToCollection()。在CollectionViewController类的viewDidLoad方法中,delegate被设置为self。

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,我必须转到另一个popVCPopVC和我的基类有viewModel 的实例

var viewModel=viewModel((我对两个类使用相同的viewModel,看看PopVC中的SaveBtn,在这个地方我使用委托方法。

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()
}

这个代码出了什么问题?

遵循MVVM方法和依赖项注入,您可以注入ViewModel,而不是在弹出控制器中创建新实例,因此,例如,在准备segue中,如果您使用Storyboard:

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)
}

我在应用程序中发现了接下来的两个问题。1.我试着做和第一个问题中一样的事情,不是插入新的单元格,而是删除单元格,为了实现我在PopVC中创建的协议,在BaseClass中进行一致性处理,并在prepareForSegueMethod中设置委托。这非常适合第一项任务。我指的是cellInsert,但不适用于delete。不同的是,当我想通过didSelectItemAtIndexPath的帮助将我的单元格删除到PopVC时,在插入的情况下,我使用加号按钮。我需要为didSelectItemAtIndexPah中的单元格设置委派吗?

2单元格选择问题:我无法选择集合视图中的第一个单元格,在didselectItemForIndePath中,我使用了方法print(indexPath.row(。问题是此打印显示了错误的行。例如,如果我选择第二行,打印会显示1或3行。一次它打印"1",另一次打印"0",另一遍打印"5"你知道这里发生了什么吗?

最新更新