2017-04-17 5 views
0

Ich habe eine Tabellenansicht mit 5 Zellen in einem Tableviewcontroller. Ich möchte, dass alle Zellen zu einem Searchtableviewcontroller übergehen. Jede Zelle ist jedoch ein anderes Thema, und wenn ich auf eine Zelle klicke, möchte ich, dass die Zelle zu ihrem entsprechenden Subjekt übergeht. Dies ist der Suchtabelle-Controller.UISearchController Segue

import UIKit 
import Firebase 
import FirebaseDatabase 

class SearchTableViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate { 

    @IBOutlet var followUsersTableView: UITableView! 
    let searchController = UISearchController(searchResultsController: nil) 



    var usersArray = [NSDictionary?]() 
    var filteredUsers = [NSDictionary?]() 

    var databaseRef = FIRDatabase.database().reference() 
    var infoRef = FIRDatabase.database().reference().child("info") 
    var loggedInUser = FIRAuth.auth()?.currentUser 
    let userID = FIRAuth.auth()?.currentUser?.uid 
    var posts = NSMutableArray() 
    var loggedUser:FIRUser? 






    override func viewDidLoad() { 
     super.viewDidLoad() 

     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 
     tableView.tableHeaderView = searchController.searchBar 

     searchController.searchBar.isTranslucent = false 

     searchController.searchBar.tintColor = UIColor(red:0.23, green:0.73, blue:1.00, alpha:1.0) 
     searchController.searchBar.searchBarStyle = .minimal 
     searchController.searchBar.placeholder = "Search Books by Title, Author & ISBN" 
     searchController.searchBar.delegate = self 
     searchController.searchBar.sizeToFit() 
     self.searchController.hidesNavigationBarDuringPresentation = false 
     self.navigationItem.title = "Search Books" 


     databaseRef.child("books").observe(.childAdded, with: { (snapshot) in 


     let key = snapshot.key 
     let snapshot = snapshot.value as? NSDictionary 
     snapshot?.setValue(key, forKey: "uid") 

     if(key == self.loggedUser?.uid) 
     { 
      print("same as logged in user") 
     } 
     else 
     { 
     self.usersArray.append(snapshot) 
      self.followUsersTableView.insertRows(at: [IndexPath(row:self.usersArray.count-1,section:0)], with: UITableViewRowAnimation.automatic) 
     } 



     }) { (error) in 
      print(error.localizedDescription) 
     } 

    } 




    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 { 
     // #warning Incomplete implementation, return the number of rows 


     if searchController.isActive && searchController.searchBar.text != ""{ 
      return filteredUsers.count 
     } 
     return self.usersArray.count 

    } 

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

     let user : NSDictionary? 

     if searchController.isActive && searchController.searchBar.text != ""{ 
      user = filteredUsers[indexPath.row] 
     } 
     else 
     { 
      user = self.usersArray[indexPath.row] 
     } 

     cell.Title.text = user?["title"] as? String 
     cell.Author.text = user?["Author"] as? String 
     cell.ISBN.text = user?["ISBN"] as? String 
     cell.Price.text = user?["Price"] as? String 
     if let imageName = user?["image"] as? String { 
      let imageRef = FIRStorage.storage().reference().child("images/\(imageName)") 
      imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in 
       if error == nil { 

        let image = UIImage(data: data!) 
        cell.Book.image = image 

       }else { 
        print("Error downloading image:") 
       }})} 

     cell.detailTextLabel?.text = user?["handle"] as? String 




     return cell 
    } 


    func filtereContent(searchText: String) 
    { 
     self.filteredUsers = self.usersArray.filter{user in 
      // let typeMatch = (scope == "Title") || (user?.fileType() == scope) 
      let title = user!["title"] as? String 
      let author = user!["Author"] as? String 
      let isbn = user!["ISBN"] as? String 


      return(title?.lowercased().contains(searchText.lowercased()))! || (author?.lowercased().contains(searchText.lowercased()))! || (isbn?.lowercased().contains(searchText.lowercased()))! 

     } 
     tableView.reloadData() 

    } 
} 


extension SearchTableViewController{ 
    func updateSearchResults(for searchController: UISearchController) { 

     filtereContent(searchText: self.searchController.searchBar.text!) 

    } 

} 

Das ist mein Tableviewcontroller, die die Zellen ausgewählt werden muss.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     myIndex = indexPath.row 

     if indexPath.section == 0 && indexPath.row == 0{ 
      performSegue(withIdentifier: "segue", sender: self) 
     } 
     else if indexPath.section == 0 && indexPath.row == 1{ 
     } 
     else if indexPath.section == 0 && indexPath.row == 2{ 
     } 
     else if indexPath.section == 0 && indexPath.row == 3{ 
     } 
     else 
     { 

     } 
     } 

Antwort

3

Praktisch sollten Sie DidSelectRowAtIndexPath Delegierten Methode und rufen performSegueWithIdentifier auf Ihre SearchViewController mit Segue Bezeichner verwenden.

self.performSegueWithIdentifier(YOUR_SEGUE_ID, sender: self) 

Bei dieser Methode werden Sie wahrscheinlich den Index des ausgewählten Objekts speichern wollen, so schlage ich Ihnen eine Art einer globalen Variablen zu erstellen, die ausgewählten Index speichert.

selectedIndex = indexPath.row 

Dann haben Sie in prepareForSegue-Methode einen Zugriff auf die destionationViewController-Eigenschaft. Sie sollten ausdrücklich den richtigen View-Controller

var destinationVC = segue.destinationViewController as! YOUR_VIEW_CONTROLLER_CLASS 

Nach diesen trivialen Manipulationen geben Sie einen freien Zugang zu allen öffentlichen Variablen und Eigenschaften von SearchViewController Klasse. Sie können also selectedIndex an diesen View-Controller übergeben.

Zum Beispiel:

destinationVC.selectedIndex = selectedIndex 

Und schließlich in einem viewDidLoad in SearchViewController Sie auf diese Variable ansprechen können das richtige Element aus dem Array zu erhalten, die entsprechenden Daten zu zeigen.

+0

Ich bevorzuge es, die Segmente direkt von jedem Zellprototyp zum Ziel einzurichten und ihnen verschiedene Bezeichner zu geben, anstatt "didSelectRowAtIndexPath" zu implementieren, aber das ist eine Frage der persönlichen Vorliebe. – NRitH

+0

@NRitH Nur aus Gründen der logischen Unterscheidung folgt die Philosophie der Design-Architektur. Ich glaube, dass die Logik der Übergänge in einer getrennten Methode sein sollte. Aber ich stimme dir zu, dass es wirklich eine persönliche Sache ist. –

+0

Ich hatte ein ähnliches Setup, leider habe ich vergessen, das zu integrieren. Ich habe meine Frage mit dem Setup aktualisiert. Wo ich eine harte Zeit habe, ist, dass die Zellen, die ich habe, zu Ergebnissen des searchviewcontrollers übergehen sollten. Zum Beispiel, auf einer meiner Zellen sagt es Biologie und wenn ich darauf klicke, möchte ich zum searchviewcontroller wechseln und es nur Biologiebücher anzeigen lassen. @KirillKorolev – juelizabeth

Verwandte Themen