2016-10-05 2 views
-1

У меня был взгляд, но я не могу найти подходящий ответ. У меня есть табличка с насекомыми с названиями наркотиков. Препараты введены, поскольку они встречаются из текста в Xcode, как показано ниже.Самый простой способ сортировки данных из UItableview в алфавитном порядке

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) 
    } 
} 

Этот список лекарств - это далеко не полный список, ведь в нем содержится много других, слишком много, чтобы сортировать вручную! И в течение следующих нескольких недель я буду больше.

У меня нет времени или силы, чтобы изменить его, чтобы он отображался в виде таблицы в алфавитном порядке, и мне интересно, может ли несколько строк кода решить проблему?

Приветствия заранее,

Марк

+0

Не помещайте все данные о наркотиках в код. Плохая, плохая идея. Поместите все это в plist или базу данных и прочитайте в данных как время выполнения. – rmaddy

+0

Я думал о том, чтобы делать это из базы данных, но на данный момент я собираюсь держаться подальше от этого и держать его в коде на время. Приветствия для ввода, хотя – Markc

ответ

4

Попробуйте добавить это, он будет сортировать drugs всякий раз, когда это свойство установлено.

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

Вы спасатель! большое спасибо – Markc

Смежные вопросы