【问题标题】:Copy Firebase data from UITableView cell to seperate view controller [closed]将 Firebase 数据从 TableView 单元格复制到单独的视图控制器 [关闭]
【发布时间】:2017-06-29 23:34:31
【问题描述】:

我有一个类似于 Instagram 等社交媒体应用的应用。在单元格中,我有一个 UIImageView 和一个通向单独视图控制器的按钮。我在单独的视图控制器中需要的是从 UILabel 中的数据库加载的文本,该文本会根据点击的单元格而改变。最好和最简单的方法是什么?

来自我的一位 cmets 的更多信息: 在 Firebase 中,我有一个名为“帖子”的小节,其中包含我的所有帖子。这些帖子显示在主页上的单元格中,该单元格还有一个“详细信息”按钮,该按钮与单独的视图控制器有一个segue。我想要做的是在单独的视图控制器中调用某个帖子,然后在 UI 标签中显示来自该帖子的数据。图片:m.imgur.com/c7fEKks?r.png

【问题讨论】:

  • 相当模糊的问题,但有两个直接的解决方案。 1)当你填充你的初始数据源(数组)时,包括所需的数据,当你连接到另一个视图控制器时,通过 segue 传递“额外”数据。 2) 当转换到另一个视图控制器时,从 Firebase 加载数据并呈现在控制器中。还有大约 50 种其他方法可以解决这个问题,但没有具体的用例数据、Firebase 结构和代码,这只是猜测。
  • @jay 在 Firebase 中,我有一个名为“posts”的小节,其中包含我所有的帖子。这些帖子显示在主页上的单元格中,该单元格还有一个“详细信息”按钮,该按钮与单独的视图控制器有一个segue。我想要做的是在单独的视图控制器中调用某个帖子,然后在 UI 标签中显示来自该帖子的数据。图片:m.imgur.com/c7fEKks?r.png
  • 明白。我评论中的两个建议都是解决方案。
  • 很抱歉,您将如何在我的 segue 代码中实现这一点
  • 问题确实含糊不清,但我添加了一个答案 - 希望对您有所帮助。

标签: xcode uitableview firebase swift3 firebase-realtime-database


【解决方案1】:

有许多关于如何通过 segue 传递数据的教程,所以这是一个快速而简短的 sn-p。

假设如下

带有显示用户名的 tableView 的 MasterViewController。 tableView 有一个填充了 UserClass 对象的数组 dataSource。这些对象是从 Firebase 填充的。

UserClass {
   userName = ""
   shoeSize = ""
}

带有文本标签的 DetailViewController。

一种名为“showDetail”的 Segue,类型为 Show Detail,它与 MasterViewController 上的 tableView 上的行绑定到 DetailViewController

当点击 tableView 中的一行时,此 segue 会“激活”,并将在 detailViewController 上显示用户的鞋码

这是当 masterViewController tableView 中的一行被点击时调用的代码(在 MasterViewController 中)。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if segue.identifier == "showDetail" {           
    if let indexPath = self.tableView.indexPathForSelectedRow {
      let aUser = usersArray[indexPath.row]
      let shoeSize = aUser.shoeSize
      let controller = (segue.destination as! 
               UINavigationController).topViewController as! DetailViewController
      controller.shoeSize = shoeSize
     }
  }
}

在detailViewController中填充变量时,显示它

@IBOutlet weak var shoeSizeLabel: UILabel!

func configureView() {
    if let shoe = self.shoeSize {
        if let label = self.shoeSizeLabel {
            label.text = shoe
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.configureView()
}

var shoeSize: String? {
    didSet {
        self.configureView()
    }
}

【讨论】:

  • (segue.destination as! UINavigationController).topViewController as!DetailViewController) 给了我一个预期的表达式错误,括号应该放在哪里?
  • @gabe as 后去掉括号!细节视图控制器。另外,如果您想查看流程,请在 XCode 中创建一个全新的项目,并选择 Master Detail 作为类型,并且 segues 等将在创建的项目模板中。
  • 好的,在查看 DetailViewConroller 时,我看到的只是 UILabel,而不是 FireBase 数据。我的 DetailViewController:pastebin.com/8g69sBW5,MainViewController:pastebin.com/jtpkBiWX
  • @gabe 我在回答中遗漏了几件事,认为您会在 XCode 中使用主-详细信息模板 - 抱歉。使用完整且经过测试的功能查看我的更新答案。
  • 非常感谢。现在我收到错误“'DetailsViewController' 类型的值没有成员'detailItem'”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多