这是使用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",
}
}
}
如下图所示:
模拟器中的表视图包含其选择器为Jeddah的所有用户的名称和详细信息。
我现在想要的是每当用户点击任何单元格时,检索另一个视图控制器中的标签中的名称,电子邮件和详细信息!
例如,如果我单击第一个单元格,则第二个视图控制器将具有以下内容:
名称: ÿ
详情:我在这里
电子邮件: y@gmail.com
我该怎么做才能做到这一点?和 我应该使用检索功能的结构是什么?
答案 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
中声明了属性DisplayMovieViewController
。 prepareForSegue()
方法在segue发生之前设置这些值。
Here is my project如果您需要更多示例/示例代码来查看。如果您愿意,可以下载并运行它。