ที่เก็บนี้ถูกสร้างขึ้นเพื่อการสาธิตมากกว่าการบริโภค อย่างไรก็ตามจากข้อเสนอแนะและการใช้ที่เก็บนี้ฉันจะเริ่มเก็บรักษาไว้ที่นี่และ priortize แก้ไข/นำปัญหาที่เพิ่มขึ้น
MVVM ? ทำไม MVC ไม่ได้แนะนำ Apple? Android MVP ยอดเยี่ยมใช่ไหม แล้วรูปแบบ ไวเปอร์ เย็นล่ะ? ฉันเชื่อว่าความพยายามที่ยอดเยี่ยมได้ถูกนำมาอธิบายแล้วว่าแต่ละรูปแบบนำมาสู่โต๊ะและความคิดที่นี่ไม่ได้เป็นการเพิ่มการอภิปราย แต่เพียงสร้างความคิดเห็นที่ฉันได้ก่อตั้งขึ้นแล้ว: MVVM เป็นวิธีที่จะไป
เพื่อเป็นไพรเมอร์อย่างรวดเร็วถึงสิ่งที่ MVVM เป็นรูปแบบการออกแบบโดย ViewModel ไกล่เกลี่ยระหว่างข้อมูลที่ให้ แบบจำลอง และ มุมมอง ที่แสดงข้อมูลที่ให้ไว้ด้านล่าง:

ใน iOS มุมมองเป็นหลัก ViewController และ ViewModel เป็นวัตถุ (โครงสร้าง) ซึ่งให้ข้อมูลที่แน่นอนสำหรับมุมมองที่จะแสดงผล
สิ่งนี้ให้สถาปัตยกรรมคู่แบบหลวม ๆ ซึ่งสามารถบำรุงรักษาได้ (คอนโทรลเลอร์มุมมองที่บางมาก) และทดสอบได้
ยังคงมีข้อแม้แม้ว่า MVVM แบบคลาสสิกจะช่วยให้หลักการรับผิดชอบเดี่ยวได้อย่างง่ายดาย (และสวยงาม) ในกรณีของโมเดลเป็นโมเดลโดเมน อย่างไรก็ตามในกรณีของแบบจำลองโรคโลหิตจาง (ซึ่งโดยทั่วไปเป็นกรณีที่คุณมี APIs REST ที่เป็นลายลักษณ์อักษรอย่างดี) หนึ่งจะต้องมีผู้ไกล่เกลี่ยหรือผู้นำเสนออื่นที่อำนวยความสะดวกข้อมูลและกระแสนำ
ตอนนี้รูปแบบการดูมีความรับผิดชอบในการอัปเดตมุมมองรวมถึงรับการอัปเดตจากมุมมองเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นจากผู้ใช้ สิ่งนี้สามารถทำได้โดยรหัสขั้นต่ำโดยใช้การเชื่อมโยงข้อมูลสองทิศทาง แต่… iOS ไม่มีกลไกการผูกสองทางที่มีอยู่นอกกรอบ!
โชคดีที่เรามีไลบรารีที่มีปฏิกิริยาเช่น RXSWIFT, RXCOCOA แต่พวกเขาหนักเกินไปเมื่อพิจารณาว่ามีผลผูกพันสองทางเป็นส่วนเล็ก ๆ ของกระบวนทัศน์การเขียนโปรแกรมปฏิกิริยา SimpletWowayBinding มุ่งมั่นที่จะให้การผูกมัดเพียงสองทางในแบบที่ไม่ถ่อมใจอย่างง่าย!
ในการเรียกใช้โครงการตัวอย่างให้โคลน repo และเรียกใช้ pod install จากไดเรกทอรีตัวอย่างก่อน
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}คุณสมบัติที่คุณต้องการ "มีประโยชน์" ในมุมมองควรประกาศว่าสามารถสังเกตได้
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} วิธี bind บน UICONTROL จัดทำสองวิธีที่มีผลผูกพันกับสิ่งที่สังเกตได้ นั่นคือรหัสทั้งหมดที่จำเป็นเพื่อให้แบบฟอร์มทำงานได้ ดูภาพหน้าจอด้านล่าง
SimpletWowayBinding มีให้บริการผ่าน cocoapods หากต้องการติดตั้งเพียงเพิ่มบรรทัดต่อไปนี้ลงใน PodFile ของคุณ:
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
SimpletWowayBinding มีอยู่ภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม