2017-04-17 8 views
0

나는 tableviewcontroller에 5 개의 셀이있는 tableview를 가지고 있습니다. 모든 셀을 검색 가능한 뷰 컨트롤러에 연결하려고합니다. 그러나 각 셀은 다른 제목이며 하나의 셀을 클릭하면 셀이 해당 대상과 구별되게하고 싶습니다. 이것은 searchtableviewcontroller입니다.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!) 

    } 

} 

이것은 셀을 선택해야하는 내 tableviewcontroller입니다.

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 
     { 

     } 
     } 

답변

3

실질적으로 당신은 didSelectRowAtIndexPath 대리인의 방법을 사용하고 SEGUE 식별자를 사용하여 SearchViewController에 performSegueWithIdentifier를 호출해야합니다. 당신은 아마 당신의 선택한 개체의 인덱스를 기억하려면이 방법

self.performSegueWithIdentifier(YOUR_SEGUE_ID, sender: self) 

, 그래서 나는 당신이 저장 인덱스를 선택하는 전역 변수의 종류를 만들 제안한다.

selectedIndex = indexPath.row 

그러면 prepareForSegue 메소드에서 destionationViewController 속성에 액세스 할 수 있습니다. 당신은 명시 적으로 SearchViewController 클래스의 모든 공용 변수와 속성에 무료로 액세스 할 수있는 적절한 뷰 컨트롤러에게 이러한 사소한 조작 후

var destinationVC = segue.destinationViewController as! YOUR_VIEW_CONTROLLER_CLASS 

를 지정해야합니다. 따라서 selectedIndex를이 뷰 컨트롤러에 전달할 수 있습니다. 예를 들어

:

destinationVC.selectedIndex = selectedIndex 

그리고 결국은 해당 데이터를 표시하도록 배열에서 적절한 항목을 얻기 위해이 변수에 어필 할 수있는 SearchViewController에있는 viewDidLoad에서

.

+0

'didSelectRowAtIndexPath'를 구현하는 대신 각 셀 프로토 타입에서 직접 대상을 설정하고 다른 식별자를 부여하는 것이 더 좋지만 개인적인 취지의 문제입니다. – NRitH

+0

@NRitH 디자인 아키텍처 철학을 따르는 논리적 구분 만하면됩니다. 나는 단편의 논리가 분리 된 방법이어야한다고 생각한다. 그러나 나는 그것이 정말로 개인적인 것이라고 당신에게 동의합니다. –

+0

나는 비슷한 설정을했다. 미안하다. 나는 그것을 포함하는 것을 잊었다. 설정으로 내 질문을 업데이트했습니다. 힘든 시간을 보내고있는 곳은 내가 가지고있는 셀이 searchviewcontroller의 결과와 일치해야한다는 것입니다. 예를 들어, 내 세포 중 하나에서 생물학을 말합니다.이 생물체를 클릭하면 searchviewcontroller에 연결하여 생물학 서적 만 표시하도록하고 싶습니다. @KirillKorolev – juelizabeth

관련 문제