Swift - “尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”
Posted
技术标签:
【中文标题】Swift - “尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”【英文标题】:Swift - "attempt to insert row 0 into section 0, but there are only 0 rows in section 0 after the update" 【发布时间】:2016-12-11 03:28:41 【问题描述】:Xcode 8.1、Swift 2.3、ios 10.1,我使用 Firebase
我使用 firebase 注册了通知。我正在尝试在 uitableview 上显示通知。 viewDidLoad() 成功连接 firebase 并获得价值。但我无法列出传入的数据。
首先我收到错误“cellForRowAtIndexPath 不起作用”。之后,我使用 forRow & inSection。但现在我得到了我不知道这意味着什么的错误。
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert row 0 into section 0, but there are only 0 rows in section 0 after the update'
NoticeViewController.swift
import UIKit
import FirebaseDatabase
import FirebaseAuth
import FirebaseStorage
private let reuseIdentifier = "NoticeViewTable"
class NoticeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
@IBOutlet weak var aivLoading: UIActivityIndicatorView!
@IBOutlet weak var noticeTableView: UITableView!
var databaseRef = FIRDatabase.database().reference()
var usersDict = NSDictionary()
var noticesArray = [AnyObject]()
var loggedInUser : AnyObject?
@IBAction func didTapAddNotice(sender: AnyObject)
let mainStorboard: UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let viewController: UIViewController = mainStorboard.instantiateViewControllerWithIdentifier("AddNoticeView")
self.presentViewController(viewController, animated: true, completion: nil)
override func viewDidLoad()
super.viewDidLoad()
self.loggedInUser = FIRAuth.auth()?.currentUser
self.aivLoading.startAnimating()
self.databaseRef.child("notice").observeEventType(.Value, withBlock: (snapshot) in
self.usersDict = snapshot.value as! NSDictionary
self.noticesArray = [AnyObject]()
for (userId, details) in self.usersDict
let noticeImg = details.objectForKey("noticeImage1") as! String
let profileImg = details.objectForKey("profileImage") as! String
let profileName = details.objectForKey("userName") as! String
let wage = details.objectForKey("wage") as! String
let noticeName = details.objectForKey("noticeName") as! String
if(self.loggedInUser?.uid != userId as? String)
details.setValue(userId, forKey: "uId")
self.noticesArray.append(details)
self.noticeTableView?.reloadData()
self.noticeTableView.insertRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: UITableViewRowAnimation.Automatic)
self.aivLoading.stopAnimating()
) (error) in
print(error.localizedDescription)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return self.noticesArray.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell: NoticeViewTableViewCell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! NoticeViewTableViewCell
let profileImageURL = NSURL(string: self.noticesArray[indexPath.row]["profileImage"] as! String)
let profileImageData = NSData(contentsOfURL: profileImageURL!)
cell.profilePic.image = UIImage(data:profileImageData!)
let noticeImageURL = NSURL(string: self.noticesArray[indexPath.row]["noticeImage!"] as! String)
let noticeImageData = NSData(contentsOfURL: noticeImageURL!)
cell.noticeImage.image = UIImage(data:noticeImageData!)
//add a border and corner radius the images
cell.profilePic.layer.masksToBounds = true
cell.profilePic.layer.cornerRadius = cell.profilePic.frame.size.width/2.0
cell.profilePic.layer.borderWidth = 1.5
let profileName = (self.noticesArray[indexPath.row]["userName"] as? String)!
cell.userName.text = profileName
let noticeName = (self.noticesArray[indexPath.row]["noticeName"] as? String)!
cell.noticeName.text = noticeName
let wage = (self.noticesArray[indexPath.row]["wage"] as? String)!
cell.wage.text = wage
return cell
【问题讨论】:
1) 使用导致错误的实际代码更新您的问题,并指出导致错误的确切行。 2) 查找错误。已经讨论过很多次了。 【参考方案1】:您的代码中有很多错误。其中任何一个都可能导致崩溃。
即使uid
无效,也会在表格视图中插入一行。
details
附加到数据源数组,但插入在表视图的索引 0 处
不要同时调用reloadData()
和insertRowsAtIndexPaths
。删除reloadData()
【讨论】:
【参考方案2】:对于遇到此问题的其他用户,在尝试更新未分配 dataSource
的 TableView 或 CollectionView 时也会出现这些错误。确保 TableView 的 dataSource
已连接(使用情节提要或 nib 时)或以编程方式分配。
【讨论】:
以上是关于Swift - “尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”的主要内容,如果未能解决你的问题,请参考以下文章