Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用firebase连接到Tableview的搜索栏_Swift_Firebase_Search_Firebase Realtime Database_Uisearchbar - Fatal编程技术网

Swift 使用firebase连接到Tableview的搜索栏

Swift 使用firebase连接到Tableview的搜索栏,swift,firebase,search,firebase-realtime-database,uisearchbar,Swift,Firebase,Search,Firebase Realtime Database,Uisearchbar,我有一个连接到Tableview的搜索栏,我不知道如何让它工作! 表视图是“记忆”的表视图。记忆有标题,用户id,身体,我希望它也能够搜索的标题。 问题是,我正在与firebase合作,我真的不知道如何在特定用户的特定记忆中搜索,以及如何从firebase中获取所有信息 我试了这么多代码行,但都没用。我需要帮助 import UIKit import Firebase import FirebaseAuth import FirebaseDatabase class MemoryViewCon

我有一个连接到Tableview的搜索栏,我不知道如何让它工作! 表视图是“记忆”的表视图。记忆有标题,用户id,身体,我希望它也能够搜索的标题。 问题是,我正在与firebase合作,我真的不知道如何在特定用户的特定记忆中搜索,以及如何从firebase中获取所有信息

我试了这么多代码行,但都没用。我需要帮助

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class MemoryViewController: UIViewController,UITableViewDelegate,UITableViewDataSource, UISearchBarDelegate, UISearchResultsUpdating {

    func updateSearchResults(for searchController: UISearchController) {
        self.memories = Array.filter({ (array: String) -> Bool in

            if array.contains(searchController.searchBar.text!)
            {
                return true
            }
            else
            {
                return false
            }

        })

        self.resultController.tableView.reloadData()

    }
    var filteredArray = [Memory]()

    var searchController = UISearchController()
    var resultController = UITableViewController()

    @IBOutlet weak var tbl: UITableView!

    @IBOutlet weak var searchBar: UISearchBar!

    var memories : [Memory] = []

    var ref : DatabaseReference!
    let sref = Storage.storage().reference()

    var lastIndex : Int = 0
    var strMode : String = ""

    var filteredData = [String]()



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return memories.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let identifier = "iden"

        var cell : UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)

        if cell == nil
        {
            cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: identifier)
        }

        let temp = memories[indexPath.row]
        cell?.textLabel?.text = temp.title
        cell?.imageView?.image = temp.image
        return cell!
    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        return true

    }


    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete
        {
            let temp = self.memories[indexPath.row]

            self.memories.remove(at: indexPath.row)

            self.ref.child("MEmories/\(temp.key)").removeValue()

            tableView.deleteRows(at: [indexPath as IndexPath], with: .fade)
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        ref = Database.database().reference()
        let rightButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(MemoryViewController.barButtonItemClicked(_:)))

        self.navigationItem.setRightBarButton(rightButton, animated: true)
        // Do any additional setup after loading the view.

        self.loadMemories()

        self.searchController = UISearchController(searchResultsController: resultController)
        tbl.tableHeaderView = self.searchController.searchBar

        self.searchController.searchResultsUpdater = self

        self.resultController.tableView.delegate = self
        self.resultController.tableView.dataSource = self



    }

    @objc func barButtonItemClicked(_ sender:UIBarButtonItem)
    {
        print("+ clicked")
        let addMemoryViewController = self.storyboard?.instantiateViewController(withIdentifier: "AddMemoryViewController") as! AddMemoryViewController

        self.strMode = "newMemory"


        self.navigationController?.pushViewController(addMemoryViewController, animated: true)



    }


    func readFromNSUSerDefault()-> Memory

    {

        let d : UserDefaults = UserDefaults.standard

        let strTitle = d.object(forKey: "title") as? String

        let strBody = d.object(forKey: "body") as? String

        let strImageRef = d.object(forKey: "imageRef") as? String

        let uid = d.object(forKey: "uid") as? String

        let imageData = d.object(forKey: "imageData") as? Data

        let key = d.object(forKey: "key") as? String



        let m = Memory(title: strTitle!, body: strBody!, key: key!, uid: uid!, imageRef: strImageRef!)

        m.image = UIImage(data: imageData!)

        m.key = key!

        return m

    }

    override func viewDidAppear(_ animated: Bool) {

        let d = UserDefaults.standard
        let newMemory = readFromNSUSerDefault()
        let userAdded = d.bool(forKey: "userAdded") //key new user = true
        let userEdited = d.bool(forKey: "userEdited")//key  user edited = true

        if self.strMode == "newMemory" &&  userAdded

        {
            self.memories.append(newMemory)
            self.tbl.reloadData()
        }

        else if self.strMode == "edit" && userEdited
        {
            memories[lastIndex] = newMemory
            self.tbl.reloadData()
        }


        d.set(false, forKey: "userAdded")
        d.set(false, forKey: "userEdited")

        d.synchronize()

        self.strMode = " "


    }

    func loadMemories()

    {

        self.ref.child("MEmories").queryOrderedByKey().observe(.value, with: {

            snapShot in

            if let dict = snapShot.value as? NSDictionary

            {

                for d in (dict as? Dictionary<String,AnyObject>)!

                {

                    let title = d.value["title"] as?String

                    let body = d.value["body"] as? String

                    let uid = d.value["uid"] as? String

                    let imageRef = d.value["imageRef"] as? String



                    let m = Memory(title: title!, body: body!, uid: uid!,imageRef:imageRef!)

                    m.key = d.key

                    let tempImageRef = self.sref.child(m.imageRef)



                    tempImageRef.getData(maxSize: 1*1024*1024, completion: {(data,error) in



                        if error == nil

                        {

                            if let imageData = data

                            {

                                m.image = UIImage(data: imageData)

                                self.memories.append(m)

                                self.tbl.reloadData()

                            }

                        }

                    })

                }



            }//end of if

            self.ref.child("MEmories").removeAllObservers()



        })

    }

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

        if let identifier = segue.identifier

        {

            if identifier == "goToEdit"

            {

                let indexPath = self.tbl.indexPathForSelectedRow

                let addMemoryViewController = segue.destination as! AddMemoryViewController

                self.strMode = "edit"

                self.lastIndex = (indexPath?.row)!

                addMemoryViewController.mode = self.strMode

                addMemoryViewController.current = memories[(indexPath?.row)!]

            }

        }

    }

}
导入UIKit
进口火基
导入FirebaseAuth
导入FirebaseDatabase
类MemoryViewController:UIViewController、UITableViewDelegate、UITableViewDataSource、UISearchBarDelegate、UISearchResultsUpdated{
func updateSearchResults(对于searchController:UISearchController){
self.memories=Array.filter({(Array:String)->Bool-in
if array.contains(searchController.searchBar.text!)
{
返回真值
}
其他的
{
返回错误
}
})
self.resultController.tableView.reloadData()
}
var filteredArray=[内存]()
var searchController=UISearchController()
var resultController=UITableViewController()
@IBL弱变量tbl:UITableView!
@ibvar搜索栏:UISearchBar!
变量内存:[内存]=[]
var-ref:DatabaseReference!
设sref=Storage.Storage().reference()
var lastIndex:Int=0
var strMode:String=“”
变量filteredData=[String]()
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回内存。计数
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让标识符=“iden”
变量单元格:UITableViewCell?=tableView.dequeueReusableCell(带标识符:标识符,for:indexPath)
如果单元格==nil
{
单元格=UITableViewCell(样式:UITableViewCell.CellStyle.default,reuseIdentifier:identifier)
}
let temp=内存[indexPath.row]
单元格?.textLabel?.text=临时标题
单元格?.imageView?.image=temp.image
返回单元!
}
func tableView(tableView:UITableView,canEditRowAt indexath:indexPath)->Bool{
返回真值
}
func tableView(tableView:UITableView,commit editingStyle:UITableViewCell.editingStyle,forRowAt indexath:indexPath){
如果editingStyle==.delete
{
让temp=self.memories[indexPath.row]
self.memories.remove(位于:indexPath.row)
self.ref.child(“MEmories/\(temp.key)”).removeValue()
tableView.deleteRows(位于:[indexPath as indexPath],带:.fade)
}
}
重写func viewDidLoad(){
super.viewDidLoad()
ref=Database.Database().reference()
let rightButton=UIBarButtonItem(barButtonSystemItem:.add,target:self,action:#选择器(MemoryViewController.barButtonItemClicked(:))
self.navigationItem.setRightBarButton(rightButton,动画:true)
//加载视图后执行任何其他设置。
self.loadMemories()
self.searchController=UISearchController(searchresultcontroller:resultController)
tbl.tableHeaderView=self.searchController.searchBar
self.searchController.searchResultsUpdater=self
self.resultController.tableView.delegate=self
self.resultController.tableView.dataSource=self
}
@objc func BARBUTTONIMCLICKED(uu发送方:UIBARBUTTONIM)
{
打印(“+单击”)
让addMemoryViewController=self.storyboard?.InstanceEviewController(标识符为:“addMemoryViewController”)作为!addMemoryViewController
self.strMode=“newMemory”
self.navigationController?.pushViewController(addMemoryViewController,动画:true)
}
func readFromNSUSerDefault()->内存
{
设d:UserDefaults=UserDefaults.standard
让strTitle=d.object(forKey:“title”)作为?字符串
让strBody=d.object(forKey:“body”)作为?字符串
将strImageRef=d.object(forKey:“imageRef”)设为?字符串
让uid=d.object(forKey:“uid”)作为?字符串
将imageData=d.object(forKey:“imageData”)设为?数据
让key=d.object(forKey:“key”)作为字符串
设m=Memory(标题:strTitle!、正文:strobdy!、键:key!、uid:uid!、imageRef:strImageRef!)
m、 image=UIImage(数据:imageData!)
m、 钥匙!
返回m
}
覆盖函数视图显示(u动画:Bool){
设d=UserDefaults.standard
让newMemory=readFromNSUSerDefault()
让userAdded=d.bool(forKey:“userAdded”)//key new user=true
让userEdited=d.bool(forKey:“userEdited”)//key user edited=true
如果self.strMode==“newMemory”&&userAdded
{
self.memories.append(newMemory)
self.tbl.reloadData()
}
否则,如果self.strMode==“编辑”&&userEdited
{
记忆[lastIndex]=新记忆
self.tbl.reloadData()
}
d、 set(false,forKey:“userAdded”)
d、 set(false,forKey:“userEdited”)
d、 同步()
self.strMode=“”
}
func loadMemories()
{
self.ref.child(“记忆”).queryOrderedByKey().observe(.value),带有:{
快照
如果让dict=snapShot.value作为NSDictionary
{
对于d(dict as?Dictionary)!
{
将title=d.value[“title”]设为?字符串
让body=d.value[“body”]作为字符串
让uid=d.value[“uid”]作为字符串
将imageRef=d.value[“imageRef”]设为?字符串
设m=Memory(title:title!、body:body!、uid:uid!、imageRef:imageRef!)
m、 key=d.key
设tempImageRef=self.sref.child(m.imageRef)
if let dict = snapShot.value as? NSDictionary
{
    for d in (dict as? Dictionary<String,AnyObject>)!
    {
       //append in memories
    }
    self.filteredArray = self.memories
    self.tbl.reloadData()
}//end of if
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let identifier = "iden"
    var cell : UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
    if cell == nil
    {
        cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: identifier)
    }
    let temp = filteredArray[indexPath.row]
    cell?.textLabel?.text = temp.title
    cell?.imageView?.image = temp.image
    return cell!
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete
    {
        let temp = self.filteredArray[indexPath.row]
        self.filteredArray.remove(at: indexPath.row)
        if let index = self.memories.firstIndex(where: { $0.title == temp.title }) {
            self.memories.remove(at: index)
        }
        self.ref.child("MEmories/\(temp.key)").removeValue()
        tableView.deleteRows(at: [indexPath as IndexPath], with: .fade)
    }
}
func updateSearchResults(for searchController: UISearchController) {
    if searchController.searchBar.text!.isEmpty {
        self.filteredArray = self.memories
    } else {
        self.filteredArray = self.memories.filter({
            $0.title.localizedCaseInsensitiveContains(searchController.searchBar.text!)
        })
    }
    self.resultController.tableView.reloadData()
}
class MemoryClass {
    var title = ""
    init(withTitle: String) {
        self.title = withTitle
    }
}
let m0 = MemoryClass(withTitle: "Gone Fishing")
let m1 = MemoryClass(withTitle: "Wedding")
let m2 = MemoryClass(withTitle: "France Vacation")
let m3 = MemoryClass(withTitle: "Italy Vacation")

let memoriesArray = [m0, m1, m2, m3]
let memoryTitleToFind = "Wedding"
let filteredArray = memoriesArray.filter { $0.title == memoryTitleToFind }
for foundMemory in filteredArray {
    print(foundMemory.title)
}
Wedding