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