致命错误:将 FirebaseData 传递给 tablviewCell 时,索引超出范围
Posted
技术标签:
【中文标题】致命错误:将 FirebaseData 传递给 tablviewCell 时,索引超出范围【英文标题】:fatal error: Index out of range, when passing FirebaseData to tablviewCell 【发布时间】:2016-10-18 13:55:28 【问题描述】:所以我正在处理一个食物列表项目,我想将 mealname/mealpic/mealDescription 从 FirebaseDatabase 传递给我的 tableViewCell。
看起来像这样enter image description here
这是我的 Firebaes 数据库结构
enter image description here
这是我在视图控制器中的代码
override func viewDidLoad()
super.viewDidLoad()
WeekMenu.delegate = self
WeekMenu.dataSource = self
let url = GIDSignIn.sharedInstance().currentUser.profile.imageURL(withDimension: 100)
let data = try? Data(contentsOf: url!)
userpic.image = UIImage(data:data!)
DataService.ds.REF_MENUDATA.observe(.value, with: (snapshot) in
if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot]
for snap in snapshot
print("SNAP: \(snap)")
if let menuDict = snap.value as? Dictionary<String, AnyObject>
let date = snap.key
let menu = menuContnet(weekmenudate: date, menuData: menuDict as! Dictionary<String, String>)
self.menus.append(menu)
)
self.WeekMenu.reloadData()
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 5
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let menu = menus [indexPath.row]
if let cell: WeekMenu = tableView.dequeueReusableCell(withIdentifier: "WeekMenu") as! WeekMenu
cell.configureCell(menu: menu)
return cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
performSegue(withIdentifier: "ToVari", sender: nil)
它在运行时崩溃并在let menu = menus [indexPath.row]
行抛出“索引超出范围”错误
我知道这个索引超出范围错误问题是一种常见问题解答 但我自己做了一些研究,它们并没有真正的帮助
谁能指出可能出了什么问题? 谢谢
更新
现在我成功地将 FirebaseDatabase 中的内容传递到我的 tableview 中。
但我从第 1 天到第 5 天有 5 个节点,但我的表格视图只显示一个(第 3 天)
在我的
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return menus.count
为什么会这样?
我的类内容如下
class menuContnet
private var _menuKey: String!
private var _mealDes : String!
private var _mealPic : String!
private var _mealname : String!
private var _menuRef: FIRDatabaseReference!
var menuKey: String
return _menuKey
var mealDes : String
return _mealDes
var mealname : String
return _mealname
var mealPic : String
return _mealPic
init (mealDes: String, mealname: String, mealPic: String)
self._mealDes = mealDes
self._mealname = mealname
self._mealPic = mealPic
init (menuKey: String, menuData : Dictionary <String, String>)
self._menuKey = menuKey
if let mealname = menuData["mealname"]
self._mealname = mealname
if let mealPic = menuData["mealPic"]
self._mealPic = mealPic
if let mealDes = menuData["mealDes"]
self._mealDes = mealDes
_menuRef = DataService.ds.REF_MENUS.child(_menuKey)
更新
if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot]
for snap in snapshot
print ("SNAP: \(snap.key)")
if let menuDict = snap.value as? Dictionary<String, String>
let key = snap.key
let menu = menuContnet(menuKey: key, menuData: menuDict)
print (key)
self.menus.append(menu)
self.WeekMenu.reloadData()
所以在打印时 ("SNAP: (snap.key)") 我得到了从第 1 天到第 5 天的所有节点
但在打印(键)时我只得到第 3 天
我认为“if let menuDict”语句导致了问题
如果我摆脱“如果”并让我的代码看起来像这样
let menuDict = snap.value as? Dictionary<String, String>
let key = snap.key
let menu = menuContnet(menuKey: key, menuData: menuDict)
print (key)
self.menus.append(menu)
self.WeekMenu.reloadData()
它在运行时崩溃并抛出“在展开可选值时意外发现 nil”错误
我想我已经到了那里,我会继续做更多的研究
感谢任何提示
【问题讨论】:
你确定你在menus
中有5个项目?
【参考方案1】:
试试看:-
DataService.ds.REF_MENUDATA.observe(.value, with: (snapshot) in
if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot]
for snap in snapshot
print("SNAP: \(snap)")
if let menuDict = snap.value as? Dictionary<String, AnyObject>
let date = snap.key
let menu = menuContnet(weekmenudate: date, menuData: menuDict as! Dictionary<String, String>)
self.menus.append(menu)
self.WeekMenu.reloadData() // This will reload your table to show your newly appended cell one at a time.
/*
if menus.count == snap.childrenCount
self.WeekMenu.reloadData() //Will only reload your table after your entire requested database has been retrieved
*/
)
然后改变你的:-
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return menus.count ?? 0
【讨论】:
嗨德拉威人,感谢您的回复。我试过你的代码,错误消失了。但是我的 tableview 上什么都没有显示...我猜 firebase 中的数据没有传入。你需要我的其他模型文件或视图控制器吗? 所以我按照您的代码成功地在 FirebaseDatebase 中传递了数据, 但它只显示一个单元格,而我在 Firebase 数据库中有 5 个节点......我已经更新了这个问题。我真的不知道问题是什么:( 您确定可以接收所有 5 个节点吗,请尝试打印。 所以我再次更新问题,我想我到了那里以上是关于致命错误:将 FirebaseData 传递给 tablviewCell 时,索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章
Symfony-Catchable致命错误:传递给Doctrine Common Collections ArrayCollection :: __ construct()的参数1必须是类(代码