2017-11-13 18 views
5

Tôi khá mới để nhanh chóng. Hiện tại, tôi đang cố tạo màn hình xem theo lập trình trong Swift 4. Màn hình được cho là có một số hình ảnh và textlabels. Tôi đã tạo ra một mô hình khung nhìn với một cấu trúc của một số hình ảnh và chuỗi đã khai báo.Nhận các giá trị ngoài tầm nhìn của mô hình

Các struct thiết lập thats trong mô hình quan điểm của tôi:

import Foundation 
import UIKit 

struct ShareUIModel { 

    let heroImage: UIImage 
    let secondHeroImage: UIImage 
    let longHeroText: String 
    let shortHeroText: String 

} 

extension ShareUIModel { 

    static func testObject() -> ShareUIModel { 
     let heroImageImage = placeholderImage 
     let secondHeroImageImage = placeholderImage 
     let longHeroTextText = "long words" 
     let shortHeroTextText = "short words" 
     return ShareUIModel(heroImage: heroImageImage, secondHeroImageImage: secondHeroImage, longHeroText: longHeroTextText, shortHeroText: shortHeroTextText) 
    } 
} 

Câu hỏi: Làm thế nào tôi có thể tạo ra một thể hiện của ShareUIModel trong một bộ điều khiển xem và truy cập vào các giá trị?

+0

Vâng .. bạn sẽ cần một lớp con UIView được thiết kế để diễn giải 'ShareUIModel'. Bạn đã làm một cái chưa? Nếu có, hãy cập nhật mã của bạn. Nếu không, tôi sẽ đăng một cách tiếp cận chung cho việc này. – murphguy

+1

@murphyguy Tôi không có UIView để giải thích nó, phần lớn tôi có trong bộ điều khiển chế độ xem là vùng chứa. –

Trả lời

5

Nói chung, bạn có thể áp dụng đối tượng MVM cho chế độ xem theo nhiều cách. Cá nhân, tôi khuyên bạn nên sử dụng trình khởi tạo convenience hoặc biến tùy chỉnh với cái được gọi là didSet trình theo dõi giá trị. Các nhà quan sát Didset được gọi khi các thông số của họ được áp dụng, mà không sửa đổi giá trị được lưu trữ.

Vì vậy, cho một lớp con uivew có thể xử lý mô hình của bạn:

class ShareUIView : UIView { 


    var model : ShareUIModel? { 
     didSet { 
      guard let mode = model else { return } 
      applyModel(mode) 
     } 
    } 

    let heroImage = UIImageView() 
    let secondHeroImage = UIImageView() 
    let longHeroLabel = UILabel() 
    let shortHeroLabel = UILabel() 

    //Initializer 
    convenience init(model: ShareUIModel) { 
     self.init() 
     self.addSubview(heroImage) 
     self.addSubview(secondHeroImage) 
     self.addSubview(longHeroLabel) 
     self.addSubview(shortHeroLabel) 
     self.model = model 
    } 

    private func applyModel(_ model: ShareUIModel) { 
     self.heroImage.image = model.heroImage 
     self.secondHeroImage.image = model.heroImage 
     self.longHeroLabel.text = model.longHeroText 
     self.shortHeroLabel.text = model.shortHeroText 
    } 

    override func draw(_ rect: CGRect) { 
     super.draw(rect) 
     buildYourComponents() 
    } 

    func buildYourComponents() { 
     //This will be called whenever ShareUIView's size or layout is applied. 
     //code to build out your labels and imageViews 
    } 

} 

Vì vậy, từ đây, bạn có thể áp dụng nó vào 's UIViewController bạn view bằng cách khởi tạo nó:

class Controller : UIViewController { 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     let shareview = ShareUIView(model: ShareUIModel.testObject()) 
     view.addSubview(shareview) 
     shareview.frame = //whatever you want here.. 
    } 

} 

Phương pháp này có nghĩa là bạn phải đặt kích thước sau đó.

Hoặc, bạn có thể xây dựng ShareView trước, sau đó áp dụng đối tượng mô hình sau đó (từ lựa chọn của người dùng hoặc từ tác vụ mạng) bằng cách áp dụng mô hình vào thông số mô hình của ShareView. Điều này đòi hỏi bạn phải có một tài liệu tham khảo mạnh để nó tuy nhiên, như trong khởi tạo nó thành lớp điều khiển của bạn:

class Controller : UIViewController { 

    var shareView : ShareUIView = { //Initialized as a parameter of Controller instead 
     var v = ShareUIView() 
     return v 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(shareView) //You add the view 
     shareView.frame = .zero//you build the view - .zero is just an example here. 
    } 

    func applyTheModelFromWherever() { 
     shareView.model = ShareUIModel.testObject() //you apply the model object. 
    } 

} 

Từ đó bạn nên có ví dụ phong phú để có được sáng tạo với cách cập nhật một cái nhìn MVVM với đó là nội dung đối tượng mô hình . Sau đó, bạn cũng sẽ tạo các phương thức để xóa nội dung, loại bỏ nội dung, v.v., tùy thuộc vào trường hợp sử dụng của chính khung nhìn đó.

+0

Như một quy tắc ngón tay cái, hãy đảm bảo bạn thực sự lưu mô hình trong phân lớp UIView bằng cách nào đó. Đặc biệt là trong các hình thức, hoặc nội dung có thể chỉnh sửa vì nó làm cho nó dễ dàng hơn để theo dõi các thay đổi, hoặc để đẩy thay đổi cho các đại biểu của bạn, vv – murphguy

+2

Cảm ơn bạn đã phản ứng, nó đã được nhiều hơn tôi đã mong đợi. –

Các vấn đề liên quan