我正确使用数据模型吗?如何组织过滤器页面的代码?

时间:2017-09-03 23:14:58

标签: ios swift model-view-controller filter uibutton

我正在创建一个过滤页面的视图。过滤器页面有20多个按钮供用户选择。他们选择的任何按钮都与完成滤镜选择时将呈现给他们的图像相对应。 (图像标记有滤镜页面上显示的相同按钮)。我感到困惑的是如何组织此页面的代码。最初我在Main.Storyboard中的Interface Builder上构建了View。我单独创建了每个按钮,并使用IBoutlets和IBactions将它们连接到与视图关联的Filter ViewController页面。这个过程花了很长时间,导致了很长的代码页。

我想知道是否有更有效的方法来做到这一点。我正在考虑编写此页面而不使用“界面”构建器并创建包含各种按钮文本的数组。这听起来像个好主意吗?包含各种按钮(组织成类别)的文本的数组是否应该创建并存储在数据模型中,还是应该创建并存储在ViewController文件中?这是一个使用数据模型来存储按钮标题字符串的情况,是否有意义?我的基础是我对MVC模型的理解。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您能够使用表格视图,整个过程会变得更加顺畅,并且那么多行代码会被削减到很少的行。

创建表格视图并拥有相应的UITableViewController

设置原型单元格并具有相应的自定义UITableViewCell类。将按钮连接到该单元格类中的IBOutlet

class MyCell: UITableViewCell {

    @IBOutlet weak var myButton: UIButton!

返回您的tableView控制器

有一个变量来保存标题:

class MyTableViewController: UITableViewController {

    var titles: [String] = []

viewDidLoad中,从数据模型中获取标题并填充titles数组。如果您在完成数组之前正在进行任何处理,那么您可能需要在表视图控制器外部执行所有工作的类或结构,并仅返回已完成的数组。在纯MVC中,表视图控制器不应该关心模型如何获得该数组,只是它返回它。如果你只是一个硬编码的数组,你可以把它放在你的视图控制器代码中,但随着事情变得越来越复杂,如果它在一个单独的文件中的不同类中会更好。

在你的cellFoRowAt方法中,为每个单元格的按钮分配一个带有行索引的数组中的标题:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView(withIdentifier: "MyCell", for: indexPath) as! MyCell

    let title = titles[(indexPath as NSIndexPath).row]

    cell.myButton.setTitle("\(title)", for: .normal)

现在,最重要的是您只需将Interface Builder中的一个按钮连接到您的IBAction即可。您将不得不检测按下了哪个按钮(因为您现在有20行,每行都有一个调用相同操作的按钮。)

@IBAction func buttonPressed(_ sender: UIButton) {

    let button = sender   // You now have the exact button that was pressed. You can get the title, get the row number, etc

}