【问题标题】:How to properly clean up my code using MVC?如何使用 MVC 正确清理我的代码?
【发布时间】:2021-04-27 02:00:46
【问题描述】:

基本上,我在 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
}}

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

【问题讨论】:

  • 不,您的示例代码没有意义。为什么 SearchBarManager 是 UIViewController 的子类?为什么这两种方法重复前 5 行?子类 UINavigationItem 并实现执行这五个操作的方法。 configurePhotoSearchController 中的最后两行似乎完全是特定的两个“PhotoSearchController”,因此它们应该进入该控制器。

标签: swift model-view-controller uisearchcontroller


【解决方案1】:

保持你的代码干净很重要,它可以让你重用代码。要实现这一点,您可以使用一些常见的设计模式,例如策略,也可以使用面向协议的编程。

我会留下一些来源,以便您可以更深入地了解如何使用 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, _ navigationItem: UINavigationItem) {
    configureSearchController(searchController: searchController, navigationItem: navigationItem, title: "Search Photos", scopeButtonTitles: ["1 Column", "2 Columns", "3 Columns"], selectedScopeButtonIndex: 2)
}

}

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多