2017-10-26 1 views
-1

habe ich diese Viewcontroller:Tableview Sortier Artikel (Swift)

import UIKit 
import AVFoundation 

class SelectClass: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    var list : [QCategoryy] = [QCategoryy]() 
    var audioPlayer : AVAudioPlayer! 
    var limit = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 
     tableView.allowsMultipleSelection = true 
     self.title = "Categories" 
     list = NearbyPlaces.getCategories() 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     list.sort() { $0.views > $1.views} 
     tableView.reloadData() 
    } 

    @IBAction func doneTapp(_ sender: Any) { 
     self.performSegue(withIdentifier: nearbySearchSegueIdentifier, sender: nil) 
    } 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let identifier = "CATEGORY_CELL" 
     let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) 
     let selectedIndexPaths = tableView.indexPathsForSelectedRows 
     let rowIsSelected = selectedIndexPaths != nil && selectedIndexPaths!.contains(indexPath) 
     /* cell.accessoryType = rowIsSelected ? .checkmark : .none */ 
     cell.accessoryType = list[indexPath.row].isSelected ? .checkmark : .none 
     cell.textLabel?.text = list[indexPath.row].name 
     return cell 
    } 

    let nearbySearchSegueIdentifier = "goToMcourse" 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let cell = tableView.cellForRow(at: indexPath)! 
     cell.accessoryType = .checkmark 

     /* self.performSegue(withIdentifier: nearbySearchSegueIdentifier, sender: list[indexPath.row]) */ 
    } 

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 
     let cell = tableView.cellForRow(at: indexPath)! 
     cell.accessoryType = .none 
    } 

    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 
     if let sr = tableView.indexPathsForSelectedRows { 
      if sr.count == limit { 
       let alertController = UIAlertController(title: "Oops", message: 
        "You are limited to \(limit) selections", preferredStyle: .alert) 
       alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: {action in })) 
       self.present(alertController, animated: true, completion: nil) 
       return nil 
      } 
     } 

     return indexPath 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     if segue.identifier == nearbySearchSegueIdentifier { 
      guard let category = sender as? QCategoryy else { 
       return 
      } 
      if let selectedRows = tableView.indexPathsForSelectedRows { 
       if let vc : CourseClass2 = segue.destination as? CourseClass2 { 
        vc.category = category 

       } 
      } 
     } 
    } 
} 

extension QCategoryy { 
    private static let ketPrefix = "category-" 

    var views:Int { 
     get { 
      return UserDefaults.standard.integer(forKey: QCategoryy.ketPrefix + name) 
     } 
    } 

    func markView() { 
     UserDefaults.standard.set(views + 1, forKey: QCategoryy.ketPrefix + name) 
    } 
} 

, wo es eine einfache Tableview, wo ich eine Zeile auswählen und

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let cell = tableView.cellForRow(at: indexPath)! 
    cell.accessoryType = .checkmark 

    /* self.performSegue(withIdentifier: nearbySearchSegueIdentifier, sender: list[indexPath.row]) */ 
} 

mit diesem performSegue auf die nächste VC gehen

/* self.performSegue(withIdentifier: nearbySearchSegueIdentifier, sender: list[indexPath.row]) */ 

mit einem anderen Ergebnis je nach der Zeile, die ich zuvor gedrückt hatte. Jetzt habe ich, dass Sie mehrere Zellen und damit dann gehen Sie vor in den nächsten VC auswählen kann es einen Knopf

ist
@IBAction func doneTapp(_ sender: Any) 
    self.performSegue(withIdentifier: nearbySearchSegueIdentifier, sender: nil) 
} 

zu schieben, aber wissen einfach nicht, warum nicht die ausgewählten Zeilen prüfen, so dass, wenn ich auf Mit der Schaltfläche werde ich zur nächsten Seite weitergeleitet, als hätte ich keine Zeilen ausgewählt. Was ist die Ursache des Problems? Wie kann ich es lösen?

+0

Ich kann nicht scheinen zu verstehen, was Sie tun möchten. Möchten Sie mehrere Zeilen auswählen und dann auf die Schaltfläche "Fertig" tippen, bevor Sie mit dem nächsten Bildschirm fortfahren? Mach es klarer. – Glenn

+0

@Glenn ja ich versuche das zu tun – seran

+0

was ist die 'CourseClass2'? –

Antwort

0

Es scheint, dass das Problem ist klar - doneTapperformSegue ruft mit sender Set nil:

@IBAction func doneTapp(_ sender: Any) { 
    self.performSegue(withIdentifier: nearbySearchSegueIdentifier, sender: nil) 
} 

In prepareForSegue Sie die Kategorie auf dem Ziel-View-Controller gesetzt, aber vor, dass Sie eine guard Aussage zu überprüfen, ob Die sender ist eine ausgewählte Kategorie. Da Sie in diesem Fall sender auf nil gesetzt haben, bewirkt dieser Schutz, dass der Code die Einstellung der Kategorie überspringt, und Sie verhalten sich so, als hätten Sie die Kategorie überhaupt nicht eingestellt (weil Sie sie wirklich nicht eingestellt haben).

Überschreibung func vorbereiten (für segue: UIStoryboardSegue, Absender: egal) {

if segue.identifier == nearbySearchSegueIdentifier { 
     guard let category = sender as? QCategoryy else { 
      return 
     } 
     if let selectedRows = tableView.indexPathsForSelectedRows { 
      if let vc : CourseClass2 = segue.destination as? CourseClass2 { 
       vc.category = category 

      } 
     } 
    } 
} 

Meine Empfehlung der guard, fallen zu lassen und stattdessen tableView.indexPathsForSelectedRows verwenden, um welche Kategorien zu bestimmen, um zum nächsten View-Controller zu senden, und verwende sie, zB:

// this will get you the list of selected categories, or if none is selected, an empty list 
let selectedCategories: [QCategoryy] = tableView.indexPathsForSelectedRows?.map({ (indexPath) -> QCategoryy in 
    return list[indexPath.row] 
}) ?? [] 
vc.categories = selectedCategories 
+0

danke für die antwort, du hast recht! aber wie kann ich tableView.indexPathsForSelectedRows in der Vorbereitung zu bestimmen, welche Kategorien zu senden? kannst du mir bitte zeigen? – seran

+0

Überprüfen Sie die aktualisierte Antwort –

+0

oh großartig! Ich nehme nur diesen Fehler "Kann nicht den Wert des Typs '[QCategoryy' 'type' QCategoryy '' in dieser Zeile zuweisen vc.categories = selectedCategories – seran