尝试包含UIViewController

时间:2016-01-29 19:28:39

标签: ios swift uiviewcontroller

可能是一个愚蠢的想法,我知道,我很抱歉这个,但几个月前我看到了这个:

http://doing-it-wrong.mikeweller.com/2013/06/ios-app-architecture-and-tdd-1.html

好吧,基本上我的想法是不把所有内容(代理,数据源等)放在ViewController内。

我通常会尝试将简单tableview的数据源放在不同的文件中,以便重用它,或者只是简单地阅读并保持视图控制器的可读性。

嗯,它在某些情况下有效,但我并不完全满意。

思考一个解决方案,假设我们可以在另一个文件中扩展一个类,并且该扩展可以访问私有方法和ivars,例如在UIViewController中添加一个UITableView:

标准的UIViewController:

import UIKit

class A: UIViewController {

    private let data = ["label1", "label2", "label3"]

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

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

好的,现在我想使用ivar data来填充TableView,但不是在这里实现UITableViewDataSource方法,而是想创建一个extension这个可以访问数据的类,如下所示:

  

N.B。这在swift中无效

class A_UITableViewDataSource extend A {

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count
    }

    //Etc...
}

嘿,看那里,我可以访问ivar data,我的ViewController看起来更具可读性。

无论如何,这只是一个小例子,让我知道你们对此的看法。

祝你有个美好的一天,谢谢你。

1 个答案:

答案 0 :(得分:0)

你在这里真正做的就是让你的模型成为VC(以非常复杂的方式)。在这个例子中,你最好使A成为一个数据对象,在你的UITableViewController子类中创建它的实例并以那种方式访问​​数据(即标准MVC):

class A : AnyObject {
    let data = ["label1", "label2", "label3"]
}
class A_UITableViewDataSource : UITableViewController {
    var a = A()

    // ...

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return a.data.count
    }
}

至少从您分享的代码中,这是我可以收集的内容(以及我的意见)。如果您认为我误解了,请给我发表评论。

如果您关注MVC的结构和VC的大小,您可以尝试遵循不同的架构模式,如MVVMVIPER

相关问题