如何使用 MVC 正确清理我的代码?

问题描述

基本上,我在 TableViewController 中有以下代码,除了一些额外的行外,它基本上在另一个 CollectionViewController 中重复:

  func configureSearchController() {
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search Albums"
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    definesPresentationContext = true
    searchController.searchBar.delegate = self
  }

为了清理两个控制器中的代码,我想将这些方法移动到一个文件中,如下所示:

class SearchBarManager: UIViewController {

func configureAlbumSearchController(_ searchController: UISearchController,_ navigationItem: UINavigationItem) {
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search Albums"
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    definesPresentationContext = true
}

func configurePhotoSearchController(_ searchController: UISearchController,_ navigationItem: UINavigationItem) {
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search Photos"
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    definesPresentationContext = true
    searchController.searchBar.scopeButtonTitles = ["1 Column","2 Columns","3 Columns"]
    searchController.searchBar.selectedScopeButtonIndex = 2
}}

这是正确的做法吗?我觉得有一种更简单的方法可以简化我想要完成的工作,但我不确定。提前致谢!

解决方法

保持代码整洁非常重要,它使您能够重用代码。要实现这一点,您可以使用一些常见的设计模式,例如 Strategy,也可以使用面向协议的编程。

我将留下一些来源,以便您可以更深入地了解如何使用 SOLID 原则实现这一目标:https://medium.com/ios-expert-series-or-interview-series/solid-design-principle-using-swift-34bb1731cfb3

在这种情况下,您需要的是一个简单的抽象,您需要创建一个能够配置任何 SearchController 的函数。我会给你一个例子,但不要让这个例子限制你,还有很多其他(和更好的方法)可以实现这一点。

 class SearchBarManager: UIViewController {

private func configureSearchController(searchController: UISearchController,navigationItem: UINavigationItem,title: String,scopeButtonTitles: [String] = [],selectedScopeButtonIndex: Int = 0) {
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = title
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    definesPresentationContext = true
    searchController.searchBar.scopeButtonTitles = scopeButtonTitles
    searchController.searchBar.selectedScopeButtonIndex = selectedScopeButtonIndex
}


func configureAlbumSearchController(_ searchController: UISearchController,_ navigationItem: UINavigationItem) {
    configureSearchController(searchController: searchController,navigationItem: navigationItem,title: "Search Albums")
}

func configurePhotoSearchController(_ searchController: UISearchController,title: "Search Photos",scopeButtonTitles: ["1 Column","2 Columns","3 Columns"],selectedScopeButtonIndex: 2)
}

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...