2017-10-23 21 views
1

私は今すべてを試しました(私が知る限り)、私は一からすべてを作ったこともありますが、それでも動作しません。xCode/Firebase検索バーセルが失敗する

私はfirebaseのデータを検索してtableviewに表示できる検索バーを作っています。ユーザーが検索バーのプロファイルをクリックすると、新しいViewControllerにそのユーザーに関する情報が表示されます。

問題は、検索を開始してからプロファイルをクリックすると、検索が行われる前にテーブルビューのその位置から開始されたプロファイルが表示されるということです。 これは、それが正しいfirebaseで2つのプロファイルを表示し、検索することなく、私が見たものである:私は、プロファイルを検索したとき

は今、「ラース・ラーセンは、」それはそれが必要のようなフィルタリング:しかし

、 「Lars Larsen」をクリックしてプロフィールを選択すると、検索前の一番上にあった「Jonas Larsen」のプロフィールが表示されます。

は、これは私のsearchViewControllerのコードです:

import UIKit 
import Firebase 

class ProfileViewController: UIViewController { 



//Outlets 
var loggedInUser:User? 
var otherUser:NSDictionary? 
var databaseRef:DatabaseReference! 
var loggedInUserData: NSDictionary? 
@IBOutlet weak var Biler: UILabel! 
@IBOutlet weak var Navn: UILabel! 
@IBOutlet weak var kundeInfo: UILabel! 
@IBOutlet weak var bilInfo: UILabel! 
@IBOutlet weak var telefonNr: UILabel! 
@IBOutlet weak var korekortNr: UILabel! 
@IBOutlet weak var personNr: UILabel! 
@IBOutlet weak var Interesse: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.databaseRef = Database.database().reference() 

    databaseRef.child("Buyers").child(self.otherUser?["Personnr"] as! String).observe(.value, with: { (snapshot) in 

     let uid = self.otherUser?["Personnr"] as! String 
     self.otherUser = snapshot.value as? NSDictionary 
     self.otherUser?.setValue(uid, forKey: "Personnr") 


    self.Navn.text = self.otherUser?["Navn"] as? String 
    self.bilInfo.text = self.otherUser?["Bil"] as? String 
    self.telefonNr.text = self.otherUser?["Telefonnr"] as? String 
    self.Interesse.text = self.otherUser?["Interesse"] as? String 
    self.personNr.text = self.otherUser?["Personnr"] as? String 
    self.korekortNr.text = self.otherUser?["Kørekortnr"] as? String 

    } 
    // Do any additional setup after loading the view. 
    )} 

あなたが他の情報が必要な場合は私に知らせてください:

import UIKit 
import FirebaseDatabase 

class SearchTableViewController: UITableViewController, 
UISearchResultsUpdating { 

let searchController = UISearchController(searchResultsController: nil) 

@IBOutlet var findKunder: UITableView! 

var loggedInUser: user? 
var usersArray = [NSDictionary?]() 
var filteredUsers = [NSDictionary?]() 

var databaseRef = Database.database().reference() 

override func viewDidLoad() { 
    super.viewDidLoad() 

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

    databaseRef.child("Buyers").queryOrdered(byChild: "Personnr").observe(.childAdded, with: { (snapshot) in 

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

     self.usersArray.append(snapshot) 

     //Insert rows 

     self.findKunder.insertRows(at: [IndexPath(row:self.usersArray.count-1,section:0)], with: UITableViewRowAnimation.automatic) 

    }) { (error) in 
     print(error) 
    } 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// 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 { 
    // #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 = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 

    let user : NSDictionary? 

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

    cell.textLabel?.text = user? ["Navn"] as? String 
    cell.detailTextLabel?.text = user?["Telefonnr"] as? String 

    // Configure the cell... 

    return cell 
} 

func updateSearchResults(for searchController: UISearchController) { 

    filterContent(searchText: self.searchController.searchBar.text!) 
} 

func filterContent(searchText:String) 
{ 
    self.filteredUsers = self.usersArray.filter{ user in 
     var fNavn = false 
     var personNr = false 
     var searchBil = false 
     var telefonNr = false 
     var korekortNr = false 


     if let Navn = user!["Navn"] as? String { 
      fNavn = Navn.lowercased().contains(searchText.lowercased()) 
     } 
     if let Bil = user!["Bil"] as? String { 
      searchBil = Bil.lowercased().contains(searchText.lowercased()) 
     } 
     if let Personnr = user!["Personnr"] as? String { 
      personNr = Personnr.lowercased().contains(searchText.lowercased()) 
     } 
     if let Kørekortnr = user!["Kørekortnr"] as? String { 
      korekortNr = Kørekortnr.lowercased().contains(searchText.lowercased()) 
     } 
     if let Telefonnr = user!["Telefonnr"] as? String { 
      telefonNr = Telefonnr.lowercased().contains(searchText.lowercased()) 
     } 



     return fNavn || personNr || searchBil || korekortNr || telefonNr 



    } 

    tableView.reloadData() 

} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    let showUserProfileViewController = segue.destination as! userProfileViewController 

    showUserProfileViewController.loggedInUser = self.loggedInUser 

    if let indexPath = tableView.indexPathForSelectedRow { 
     let user = usersArray[indexPath.row] 
     showUserProfileViewController.otherUser = user 
    } 
} 


} 

は、これは私がプロフィールを示すために使用するコードです。私はあなたが助けることを願っています

答えて

1

検索バーがアクティブで、テキストが含まれている場合、filteredUsersアレイからusersArrayではなくProfileViewControllerにユーザーを渡す必要があります。サイドノートでは

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

    if let indexPath = tableView.indexPathForSelectedRow { 
     if searchController.isActive && searchController.searchBar.text != "" { 
      showUserProfileViewController.otherUser = filteredUsers[indexPath.row] 
     } else { 
      showUserProfileViewController.otherUser = usersArray[indexPath.row] 
     } 
    }   
} 

、あなたは私たちスウィフトでNSDictionaryべきではありません。代わりにSwiftのDictionaryを使用してください(あなたの場合は、[String: Any])。

+0

varユーザー:ユーザー、宣言されていないタイプの「ユーザー」と表示されます –

+0

@JonasLarsen更新されたコードを確認してください。 – the4kman

+0

完璧に動作します、ありがとうございます –

0

私が正しくあなたのコードを理解していた場合、あなたの問題はここにある:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    let showUserProfileViewController = segue.destination as! userProfileViewController 

    showUserProfileViewController.loggedInUser = self.loggedInUser 

    if let indexPath = tableView.indexPathForSelectedRow { 
     let user = usersArray[indexPath.row] 
     showUserProfileViewController.otherUser = user 
    } 
} 

let user = usersArray[indexPath.row] // this is wrong 

検索バーがアクティブな場合は、結果をフィルタリングするので、あなたの更新データソース

let user = filteredUsers[indexPath.row] 

を使用する必要があります基本的に、あなたはセグをする前に間違った情報を渡しています。

+0

悪い教えがありますか? –