如何在VIPER iOs中将IBOutlet值从视图传递给interactor?

如何在VIPER iOs中将IBOutlet值从视图传递给interactor?,ios,swift,cocoa-touch,viper,viper-architecture,Ios,Swift,Cocoa Touch,Viper,Viper Architecture,我有一个与视图一起加载的文本视图。然后,用户可以编辑和修改该值,当用户按下导航按钮中的返回键时,将启动ViewWillEvale(),并将textView outlet的值传递给interactor,interactor将从dataManager触发一个方法,将该值保存到核心数据 我的问题是,在不违反viper规则的情况下,传递此参数的最佳方式是什么 我是那样做的,但我几乎可以肯定我做错了。这是我第一次体验VIPER Architecture,如有任何帮助,我将不胜感激 查看文件: import

我有一个与视图一起加载的文本视图。然后,用户可以编辑和修改该值,当用户按下导航按钮中的返回键时,将启动ViewWillEvale(),并将textView outlet的值传递给interactor,interactor将从dataManager触发一个方法,将该值保存到核心数据

我的问题是,在不违反viper规则的情况下,传递此参数的最佳方式是什么

我是那样做的,但我几乎可以肯定我做错了。这是我第一次体验VIPER Architecture,如有任何帮助,我将不胜感激

查看文件:

import Foundation
import UIKit
class NoteDetailView : UIViewController  {

    var presenter: NoteDetailPresenterProtocol?
    @IBOutlet weak var detailNoteText: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        presenter?.viewDidLoad()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        presenter?.updatedText = detailNoteText.text
        presenter?.viewWillDisappear()
    }



}
extension NoteDetailView : NoteDetailViewProtocol {
    func showNote(noteDetail note: NoteModel) {
        detailNoteText.text = note.noteText
    }
}
演示者:

import Foundation
class NoteDetailPresenter : NoteDetailPresenterProtocol {
    var view: NoteDetailViewProtocol?
    var updatedText: String?
    var note: NoteModel?

    var router: NoteDetailRouterProtocol?

    var interactor: NoteDetailInteractorProtocol?

    func viewDidLoad(){
        view?.showNote(noteDetail: note!)
    }

    func viewWillDisappear() {
        guard note?.noteText.isEmpty == false, let text = updatedText else {return}
        interactor?.retrieveNote(note: note!, updatedText : text)
    }
}
交互者:

import Foundation
class NoteDetailInteractor : NoteDetailInteractorProtocol {
    var dataManager: NewNoteDataManagerProtocol?
    var localDataManager: NoteListLocalDataManagerInputProtocol?

    func retrieveNote(note: NoteModel, updatedText : String) {
        do {
            if let noteList = try localDataManager?.retrieveNoteList() {

                let noteModelList = noteList.map(){
                    return NoteModel(noteText : $0.noteText != nil ? $0.noteText! : "", creationDate : $0.creationDate != nil ? $0.creationDate! : "")
                }
                if !noteModelList.isEmpty {
                    var noteTextExist = false
                    var indexPath = 0
                    for (index,newnote) in noteModelList.enumerated(){
                        if newnote == note {
                            noteTextExist = true
                            indexPath = index
                        }
                    }
                    if noteTextExist == true {
                        do {
                            noteList[indexPath].noteText = updatedText
                            try dataManager?.updateNote(note: noteList[indexPath])
                        }
                        catch {
                            print(error)
                        }
                    }
                }
            }

        }
        catch {
            print(error)
        }
    }

}
数据管理器:

import Foundation
import CoreData
import UIKit
class NewNoteDataManager : NewNoteDataManagerProtocol{

    func deleteNote(note: Note) throws {
        guard let managedOC = CoreDataStore.managedObjectContext else {
            throw PersistenceError.managedObjectContextNotFound
        }
        managedOC.delete(note)
        do {
            try managedOC.save()
        }
        catch let error as NSError {
            print(error)
        }
    }

    func updateNote(note: Note) throws {
        guard let managedOC = CoreDataStore.managedObjectContext else {
            throw PersistenceError.managedObjectContextNotFound
        }
        do {
            try managedOC.save()
        }
        catch let error as NSError {
            print(error)
        }

    }

    func saveNote(noteText: String) throws {
        guard let managedOC = CoreDataStore.managedObjectContext else {
            throw PersistenceError.managedObjectContextNotFound
        }

        if let entity = NSEntityDescription.entity(forEntityName: String("Note"), in: managedOC) {
            do {
                let newNote = Note(entity: entity, insertInto: managedOC)
                newNote.noteText = noteText

                let date = Date()
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
                newNote.creationDate = formatter.string(from: date)
                try managedOC.save()
            }catch let error as NSError {
                print(error)
            }
        }else {
            throw PersistenceError.couldNotSaveObject
        }
    }


}
可在此处找到完整的项目:

老实说,我认为你的方法还可以。有人可能会说,最好不要在presenter中存储“updatedText”和“note”之类的数据,而是通过方法将这些数据传递给presenter

您应该在presenter中引用视图,以避免保留循环。
由于当演示者处于活动状态时,interactor和router都不会为零,所以您可以将它们声明为非可选的,并在init中初始化它们。interactor中的dataManager引用也是如此。

Github链接没有最新提交的代码。@PratikSodha现在已更新。那是在发展部。现在是大师布兰奇完全忘记了保留周期。谢谢你,还有其他的。我在视图中编写了一个getter方法来获取iboutlet文本。这是个好办法吗?似乎很合理。当要访问的视图数据量增加时,请尝试将其分组,以避免视图中出现十几个getter:)