【问题标题】:Correct MVC approach for UITableViewCell updating model?UITableViewCell 更新模型的正确 MVC 方法?
【发布时间】:2018-02-14 03:14:43
【问题描述】:

我对 MVC 还很陌生,我有一个关于模型和视图的问题。我有一些内容视图,允许用户通过点击来收藏该内容。这发生在视图中,我需要使用新信息更新数据模型。在我看来,简单的方法是在每个单元格上都有一个 Note 属性,然后当在控制器中点击该单元格时,我可以使用与该关联的注释在 DataSource 上调用 addFavoriteNoteremoveFavoriteNote细胞。但是,Note 是模型中的一个类,因此我的理解是在UITableViewCell 中包含Note 属性是不正确的。这在 MVC 中是错误的吗?如果是,那么面向 MVC 的方法是什么?

class Note: Comparable {
var content: String!
var creationDate: Date!
var author: Person!
init(content: String, creationDate: Date, author: Person) {
    self.content = content
    self.author = author
    self.creationDate = creationDate
}
convenience init(author: Person) {
    self.init(content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in efficitur nulla. Suspendisse facilisis tincidunt dictum. Praesent bibendum efficitur lectus vitae imperdiet. Sed odio est, fermentum et turpis vel, pellentesque volutpat magna. Aliquam iaculis libero at dignissim rutrum. Phasellus luctus elementum eros, gravida consequat tellus dignissim ultricies. Ut consectetur ut ante imperdiet molestie. Aliquam blandit, nulla eu egestas accumsan, diam justo varius augue, vel pellentesque felis tortor in orci. In nunc erat, luctus a mauris in, molestie blandit lorem. Vestibulum cursus, ligula sed lobortis vulputate, mauris eros finibus dui, id pretium lacus tortor eu erat. Curabitur pretium, ante in pellentesque vehicula, metus quam interdum leo, faucibus facilisis tellus massa a turpis. Pellentesque sit amet est sem. Vestibulum posuere luctus libero pretium faucibus", creationDate: Date(), author: author)
}
static func <(lhs: Note, rhs: Note) -> Bool {
    return lhs.creationDate < rhs.creationDate
}

static func ==(lhs: Note, rhs: Note) -> Bool {
    return lhs.creationDate == rhs.creationDate
}
}

class DataSource: NSObject {
private var favorites: [Note] = []

func addFavoriteNote(note: Note) {
    favorites.append(note)
}

func removeFavoriteNote(note: Note) {
    if let index = favorites.index(of: note) {
        favorites.remove(at: index)
    }
}

//...more stuff
}

【问题讨论】:

    标签: ios swift model-view-controller


    【解决方案1】:

    您不应该让单元更新模型是正确的。您的单元应通知视图控制器检查/取消检查的事件。这将使用委托模式或使用闭包来实现。视图控制器将是委托或提供在单元格中发生事件时调用的闭包。作为控制器,视图控制器可以根据需要通过更新模型来处理此事件。

    控制器为视图(在本例中为单元格)提供足够的数据来显示自身。

    控制器处理来自导致模型更新的视图(例如单元格)的事件。

    控制器处理模型事件并告诉视图根据更新的数据进行更新。

    【讨论】:

    • 我明白这一切。我的具体问题是如何确定模型中的哪个注释对应于单击的单元格?我需要以某种方式将单元格中的文本框值与 Note 对象相关联,然后从模型的收藏夹列表中删除该注释。
    • 单元格会将自己作为参数传递给委托方法或闭包。然后视图控制器可以询问表格视图单元格与哪个 indexPath 相关联。从 indexPath 中,控制器可以像在cellForRowAt 方法中一样从模型中获取所需的数据。
    • 谢谢!就像一本带有 IndexPaths 和 Data 的字典?
    • 可能不会。通常,您的表格视图的数据模型有一组数据。
    • 如果模型数据被修改(即接收到新数据),ViewController数组中的数据与模型不一致怎么办?
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多