根据项目名称和Details-Swift项目从firebase检索用户信息

时间:2016-04-14 08:39:21

标签: ios xcode swift firebase data-retrieval

这是使用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",
}
 }
} 

如下图所示:

enter image description here

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

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

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

名称: ÿ

详情:我在这里

电子邮件: y@gmail.com

我该怎么做才能做到这一点?和 我应该使用检索功能的结构是什么?

2 个答案:

答案 0 :(得分:1)

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

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' 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方法我传递了唯一用户ID需要的userID来获取它在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

            }

        }



            })
    }

希望你的问题能得到解决。我用上面的方法做了这种方法。

答案 1 :(得分:0)

由于您有tableView来自Firebase的某些数据,我假设您已成功拨打Firebase并获取数据。

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

然后,在tableView中,您只需显示所需的数据,并在点按某个单元格时,将User课程的该实例发送到下一个ViewController prepareForSegue方法。

在下一个ViewController中,您现在可以访问User的所有数据,这样您就可以显示您需要/想要在该页面上显示的任何内容。

希望这有帮助。

编辑:

User类或您选择调用它的任何内容都将是一个单独的Swift文件。我编写的Movie课程的Here's an example是为了跟踪电影数据。

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

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

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

            }
        }

    }

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

Here is my project如果您需要更多示例/示例代码来查看。如果您愿意,可以下载并运行它。