ios - 按字母顺序对 UItableview 中的数据进行排序的最简单方法

标签 ios swift uitableview sorting

我看过但找不到合适的答案。 我有一个表格 View ,其中填充了药物名称。如下所示,已将遇到的药物从文本输入到 Xcode 中。

class MasterViewController: UITableViewController {

// MARK: - Properties
var detailViewController: DetailViewController? = nil
var drugs = [Drug]()
var filtereddrugs = [Drug]()
let searchController = UISearchController(searchResultsController: nil)

// MARK: - View Setup
override func viewDidLoad() {
    super.viewDidLoad()

    // Setup the Search Controller
    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self
    definesPresentationContext = true
    searchController.dimsBackgroundDuringPresentation = false

    // Setup the Scope Bar
    searchController.searchBar.scopeButtonTitles = ["All", "Green", "Blue", "Amber", "Red", "Black"]
    tableView.tableHeaderView = searchController.searchBar

    drugs = [
        Drug(category:"Green", name:"Magnesium Trisilicate"),
        Drug(category:"Green", name:"Co-magaldrox (Mucogel)"),
        Drug(category:"Green", name: "Gastrocote"),
        Drug(category:"Green", name:"Infant Gaviscon"),
        Drug(category:"Green", name:"Peptac"),
        Drug(category:"Green", name:"Mebeverine"),
        Drug(category:"Green", name:"Fybogel Mebeverine"),
        Drug(category:"Black", name:"Peppermint oil")]


 if let splitViewController = splitViewController {
            let controllers = splitViewController.viewControllers
            detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
        }
    }

override func viewWillAppear(_ animated: Bool) {
    clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
    super.viewWillAppear(animated)
}

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

// MARK: - Table View
override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchController.isActive && searchController.searchBar.text != "" {
        return filtereddrugs.count
    }
    return drugs.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let drug: Drug
    if searchController.isActive && searchController.searchBar.text != "" {
        drug = filtereddrugs[(indexPath as NSIndexPath).row]
    } else {
        drug = drugs[(indexPath as NSIndexPath).row]
    }
    cell.textLabel!.text = drug.name
    cell.detailTextLabel!.text = drug.category
    return cell
}

func filterContentForSearchText(_ searchText: String, scope: String = "All") {
    filtereddrugs = drugs.filter({( drug : Drug) -> Bool in
        let categoryMatch = (scope == "All") || (drug.category == scope)
        return categoryMatch && drug.name.lowercased().contains(searchText.lowercased())
    })
    tableView.reloadData()
}

// MARK: - Segues
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = tableView.indexPathForSelectedRow {
            let drug: Drug
            if searchController.isActive && searchController.searchBar.text != "" {
                drug = filtereddrugs[(indexPath as NSIndexPath).row]
            } else {
                drug = drugs[(indexPath as NSIndexPath).row]
            }
            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
            controller.detailDrug = drug
            controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}

}

extension MasterViewController: UISearchBarDelegate {
    // MARK: - UISearchBar Delegate
    func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
        filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
    }
}


extension MasterViewController: UISearchResultsUpdating {
    // MARK: - UISearchResultsUpdating Delegate
    func updateSearchResults(for searchController: UISearchController) {
        let searchBar = searchController.searchBar
        let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
        filterContentForSearchText(searchController.searchBar.text!, scope: scope)
    }
}

此药物列表不是完整列表,实际上包含更多药物,太多无法手动排序!在接下来的几周内,我将输入更多内容。

我没有时间也没有能力将其更改为按字母顺序显示在 TableView 中,我想知道几行代码是否可以解决这个问题?

提前干杯,

标记

最佳答案

尝试添加这个,它会在设置属性时对 drugs 进行排序。

var drugs = [Drug]() {
    didSet {
        drugs.sort { $0.name < $1.name }
    }
}

关于ios - 按字母顺序对 UItableview 中的数据进行排序的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39883576/

相关文章:

swift - 如何刷新弹出窗口

ios - 子类 UIButton 来保存数据?

objective-c - 如何将底部阴影添加到具有动态高度的表格单元格?

iphone - 单击单元格时的 UITableViewCellAccessoryCheckmark

ios - 无法在 UI 表格 View 自定义单元格中插入分隔符

ios - 你如何从 Swift 向 os_log 传递错误?

ios - 当应用程序在后台使用 Sinch iOS SDK 时无法处理来电推送通知

swift - (swift) 如何将文本字段链接到按钮以修改变量

ios - 如何在 Swift 中对字符串进行切片?

ios - 为 React Native 设置 Realm 时遇到问题 : `rnpm link realm` stalls without further info or output