2017-03-10 1 views
0

Ich habe eine UITableView erstellt, die ihre Daten aus einer txt.file bezieht. Obwohl die txt-Datei alphabetisch sortiert ist, ist dies bei UITableView nicht der Fall.Wie kann ich mein UITableView alphabetisch bestellen?

Kann jemand alphabetisch sortieren/sortieren?

Ich bin mit Swift 3 und Xcode 8.

var dictA = [String:String]() 
var filtereddictA = [String:String]() 
var visibleA = [ String ]() 
var searchController = UISearchController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let path = Bundle.main.path(forResource: "a", ofType:"txt") 

    let filemgr = FileManager.default 
    if filemgr.fileExists(atPath: path!) { 
     do { 
      let fullText = try String(contentsOfFile: path! ,encoding: String.Encoding.utf8) 

      let readings = fullText.components(separatedBy: "\n") 

      for abteilungen in readings { 
       let aData = abteilungen.components(separatedBy: "\t") 

       if abteilungenData.count > 1 { 
        dictA[aData[0]] = aData[1] 
       } 
      } 
      filtereddictA = dictA 

     } catch let error { 
      print("Error: \(error)") 
     } 

     searchController = UISearchController (searchResultsController: nil) 
     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 
     searchController.searchBar.sizeToFit() 

     tableView.tableHeaderView = searchController.searchBar 

     definesPresentationContext = true 
    } 

    self.title = "A" 

} 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return filtereddictA.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    let key = Array(filtereddictA.keys)[indexPath.row] 

    cell.textLabel?.text = key 
    cell.detailTextLabel?.text = filtereddictA[key] 

    return cell 
} 

@available(iOS 8.0, *) 
public func updateSearchResults(for searchController: UISearchController) { 
    guard let searchText = searchController.searchBar.text?.lowercased() else { 
     return 
    } 

    let keyPositions = Array(filtereddictA.keys) 
    filtereddictA = [:] 
    var removeArray = [ IndexPath ]() 
    var addArray = [ IndexPath ]() 
    for ab in dictA { 
     if abteilung.key.lowercased().range(of: searchText) != nil || a.value.lowercased().range(of: searchText) != nil || searchText.isEmpty { 
      filtereddictA[ab.key] = ab.value 
     } else { 
      if let index = keyPositions.index(of: abteilung.key) { 
       removeArray.append(IndexPath(row: index, section: 0)) 
      } 
     } 
    } 

    if removeArray.count > 0 { 
     removeArray.sort(by: { (p1,p2) -> Bool in 
      return p1.row > p2.row 
     }) 
     tableView.deleteRows(at: removeArray, with: .bottom) 
    } 
    var i = 0 
    for ab in filtereddictA.keys { 
     if !keyPositions.contains(ab) { 
      addArray.append(IndexPath(item: i, section: 0)) 
     } 
     i += 1 
    } 
    if addArray.count > 0 { 
     addArray.sort(by: { (p1,p2) -> Bool in 
      return p1.row < p2.row 
     }) 
     tableView.insertRows(at: addArray, with: .bottom) 
    } 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return filtereddictA.count 
} 
+0

Bitte geben Sie den Code, den Sie verwenden die Textdatei, die Textdatei selbst und die Tabellen-Ansicht-Datenquelle zu lesen. –

+0

editiert @George Green – user7630200

+0

Dictionarys sind nicht sortiert, wenn Sie 'Array (filededictAbteilen.keys) [indexPath.row]' aufrufen, wird ein Array aus Ihren Dictionary Keys erstellt, aber Sie sortieren sie nicht. Es wäre besser, wenn Sie eine einfache Struktur zum Speichern Ihrer Daten erstellen (anstatt eines Schlüsselwertpaares) und sie einmal beim Erstellen sortieren. Wird posten, wie dies in einem min. –

Antwort

3

Sie sollten die richtige Reihenfolge der Elemente in der Datenquelle festgelegt. Ich kann annehmen, dass filtereddictAbteilungen Wörterbuch ist, dass Sie Datenquelle sind.

So sortiere es zuerst und das bevölkern über tableView.

Beispiel:

let dictionary = [ 
    "A" : [1, 2], 
    "Z" : [3, 4], 
    "D" : [5, 6] 
] 

let sortedKeys = dictionary.sorted(by: { $0.0 < $1.0 }) 
+0

Meine Datenquelle ist eine txt-Datei und das Diktat heißt "dictAbteilungen" Das Array "gefiltertedictAbteilungen" ist nur das Array, das nach der Suche nach etwas mit der Suchleiste angezeigt werden soll. Ich mache immer noch nicht wirklich, wie man das macht :( – user7630200

+0

Versuchen Sie dictAbteliungen zuerst zu sortieren –

+0

Tut mir leid, aber ich weiß immer noch nicht wie :(Ich bin ein absoluter Anfänger ... – user7630200

Verwandte Themen