根据项目名称和详细信息-Swift 项目从 firebase 中检索用户的信息

Retrieving user's Info from firebase based on project name and Details-Swift Project

这是使用 swift 和 firebase 的 iOS 应用程序的一些用户的仪表板结构:

{
"users" : {
"0a0462bb-86a1-4140-bda2-90a62236ab1e" : {
  "Picker" : "Jeddah",
  "details" : "I'm here",
  "email" : "y@gmail.com",
  "name" : "y",
},
"0b71693a-4f16-4759-acd6-706da1a466a0" : {
  "Picker" : "Jubail",
  "details" : "iOS second",
  "email" : "Siham0@gmail.com",
  "name" : "Siham",
},
"0b71693a-4f16-4759-acd6-706da1a466a0" : {
  "Picker" : "Jeddah",
  "details" : "",
  "email" : "roro0@gmail.com",
  "name" : "roro",
}
 }
} 

如下图:

模拟器中的 table 视图包含选择器为 Jeddah 的所有用户的名称和详细信息。

我现在想要的是在用户单击任何单元格时在另一个视图控制器中检索标签中的姓名、电子邮件和详细信息!

例如,如果我单击第一个单元格,第二个视图控制器将具有以下内容:

姓名: y

详情:我来了

邮箱: y@gmail.com

我应该怎么做才能让它发挥作用?和 我应该使用什么检索函数结构?

由于您有 tableView 显示来自 Firebase 的一些数据,我假设您已经成功调用 Firebase 并获取数据。

执行此操作的最佳方法是编写自定义 class User 或适当命名的内容,您可以在其中存储对 Firebase 的初始调用中的所有详细信息。

然后,在您的 tableView 中,您可以只显示您想要的数据,当点击一个单元格时,您将 User class 的那个实例发送到下一个ViewController 通过 prepareForSegue 方法。

在接下来的 ViewController 中,您现在可以访问那个 User 的所有数据,因此您可以显示任何您 need/want 想在那个页面上显示的内容。

希望这对您有所帮助。

编辑:

User class 或您选择的任何名称都将是一个单独的 Swift 文件。 Here's an example of a Movie class 我写信是为了跟踪电影数据。

您可以拥有一个 class 数组:var movieArray = [Movie]()

然后您可以浏览所有 Firebase 数据,创建 class 的新实例并附加到您的数组。

func loadMovies() {
        print("Loading movies now")
        currentUserMovies.observeEventType(.Value) { (snapshot: FDataSnapshot!) in
            let json = JSON(snapshot.value)
            var movieArr = [Movie]()
            print(json)
            for (key, subJson) in json {
                let name = key
                let userrating = subJson["User Rating"].int!
                let imagePath = subJson["Image"].string!
                let plot = subJson["Plot"].string! ?? "No Plot Found!"
                let imdbRating = subJson["IMDB Rating"].string!
                var image = UIImage()
                if let url = NSURL(string: imagePath) {
                    if let data = NSData(contentsOfURL: url) {
                        image = UIImage(data: data)!
                    }
                }
                let movie = Movie(name: name, rating: userrating, image: image, plot: plot, imdbRating: imdbRating)
                movieArr.append(movie!)
            }
            self.myArray = movieArr
        }
    }

我在这里使用SwiftyJSON来解析数据。您可以在他们的 Github.

上找到有关如何执行此操作的示例

您可以在 TableViewController 中使用 prepareForSegue 方法。 示例:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
        print("Preparing")
        if (segue.identifier == "showSearchResult")
        {
            if let destinationViewController = segue.destinationViewController as? DisplayMovieViewController {
                destinationViewController.plot = self.moviePlot
                destinationViewController.imdbRating = self.movieRating
                destinationViewController.name = self.movieName
                destinationViewController.imagePath = self.moviePicturePath

            }
        }

    }

我在 DisplayMovieViewController 中声明了属性 plot, imagePath, name and imdbRatingprepareForSegue() 方法在 segue 发生之前设置这些值。

Here is my project 如果您需要更多 examples/sample 代码来查看。如果需要,请下载并运行。

我确实通过简单的格式制作了一个包含所有列表值的数组,并显示如下项目列表:

var namesArray : NSMutableArray = []

它的 viewDidLaod 方法如下所示:

 override func viewDidLoad() {
        super.viewDidLoad()



        ref.queryOrderedByChild("Picker").queryEqualToValue("Makkah")
                    .observeSingleEventOfType(.Value, withBlock: { snapshot in


                        if let dict = snapshot.value as? NSMutableDictionary{
                            print("print \(dict)")


                            for (key,value) in dict {
                                 let mainDict = NSMutableDictionary()
                                mainDict.setObject(key, forKey: "userid")


                                 if let dictnew = value as? NSMutableDictionary{

                                    if let metname = dictnew["name"] as? String
                                    {
                                        mainDict.setObject(metname, forKey: "name")

                                    }
                                    if let metname = dictnew["Picker"] as? String
                                    {
                                        mainDict.setObject(metname, forKey: "Picker")

                                    }
                                    if let metname = dictnew["details"] as? String
                                    {
                                        mainDict.setObject(metname, forKey: "details")

                                    }
                                    if let metname = dictnew["email"] as? String
                                    {
                                        mainDict.setObject(metname, forKey: "email")

                                    }
                                    if let metname = dictnew["provider"] as? String
                                    {
                                        mainDict.setObject(metname, forKey: "provider")

                                    }

                                }
                                self.namesArray.addObject(mainDict)
                        }

                            print("arrayt is \(self.namesArray)")


                    }

                        self.CookingTableView.reloadData()
                        })


    }

而它在 TableView 中的数组 Show cellForRowAtIndexPath 必须有如下代码:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = self.CookingTableView.dequeueReusableCellWithIdentifier("CookingCell", forIndexPath: indexPath) as! CookingTableViewCell

        if let name = namesArray[indexPath.row] as? NSMutableDictionary{

             cell.BusinessNameLabel?.text = name["name"] as? String
            cell.DescriptionLabel?.text = name["details"] as? String
        }

        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator

        return cell

    }

现在上市的事情已经完成了。让我们在 didSelectRowAtIndexPath 方法上显示其详细信息:

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {


                 tableView.deselectRowAtIndexPath(indexPath, animated: true)
                 dispatch_async(dispatch_get_main_queue()) { [unowned self] in

                    let DetailsViewController = self.storyboard!.instantiateViewControllerWithIdentifier("ProjectDetailsViewController") as! ProjectDetailsViewController

                    if let name = self.namesArray[indexPath.row] as? NSMutableDictionary{

                        DetailsViewController.self.strUserid = name["userid"] as? String
                    }


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

        }
    }

在上面的 didSelect 方法中,我传递了 userID 唯一用户 ID 需要在 PushedViewController 中获取它的详细信息。您还可以将所选项目的墙字典发送到 nextviewController,但我在 nextViewController 中使用调用的 firebase 查询方法,因此 nextViewController 代码如下所示:

var strUserid : NSString!

它是 ViewDidLoad:

 override func viewDidLoad() {
        super.viewDidLoad()

        print("idis \(self.strUserid)")


      ref.childByAppendingPath(self.strUserid as String).observeEventType(.Value, withBlock: { snapshot in


         if let dict = snapshot.value as? NSMutableDictionary{

            print("dict is \(dict)")

            if let name = dict["name"] as? String
            {
               self.Name.text = name

            }

            if let details = dict["details"] as? String
            {
                self.Details.text = details

            }

            if let email = dict["email"] as? String
            {
                self.Email.text = email

            }

        }



            })
    }

就是这样 希望您的问题得到解决。我用上面的方法做了这种方法。