Swift UITableView未显示正确的行数

Swift UITableView未显示正确的行数,swift,uitableview,core-data,swift3,nsfetchrequest,Swift,Uitableview,Core Data,Swift3,Nsfetchrequest,我的cellForRow在索引路径函数中有一个问题,我不能很遗憾地发现它。因此,我转向这个机构中善良的人们。 我执行一个fetch请求,返回类型为Floors的结果数组(这是我的实体)。我在表中只有一个部分,结果只有一行。如果我声明5个楼层,我只会得到一行文本值为“4”的楼层。它始终是我声明的值-1。有人能看一下我的代码并帮我发现问题吗?谢谢你和亲切的问候 class AssignNumberOfRoomsForFloorsVC: UITableViewController { //MARK:

我的cellForRow在索引路径函数中有一个问题,我不能很遗憾地发现它。因此,我转向这个机构中善良的人们。 我执行一个fetch请求,返回类型为Floors的结果数组(这是我的实体)。我在表中只有一个部分,结果只有一行。如果我声明5个楼层,我只会得到一行文本值为“4”的楼层。它始终是我声明的值-1。有人能看一下我的代码并帮我发现问题吗?谢谢你和亲切的问候

class AssignNumberOfRoomsForFloorsVC: UITableViewController {

//MARK: - Properties

private var managedObjectContext: NSManagedObjectContext!

private var storedFloors = [Floors]()


//MARK: - Actions

override func viewDidLoad() {
    super.viewDidLoad()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    loadFloorData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

private func loadFloorData() {
    let request: NSFetchRequest<Floors> = Floors.fetchRequest()
    request.returnsObjectsAsFaults = false
    do {
        storedFloors = try managedObjectContext.fetch(request)
        self.tableView.reloadData()
    }
    catch {
        print("could not load data from core \(error.localizedDescription)")

    }
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return storedFloors.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "floor cell", for: indexPath) as! FloorCell
    let floorItem = storedFloors[indexPath.row]
    cell.floorNumberTxt.text = String(floorItem.floorNumber)
    return cell
}
类AssignNumberOfRoomsForFloorsVC:UITableViewController{
//标记:-属性
私有var managedObjectContext:NSManagedObjectContext!
私有var storedFloors=[楼层]()
//马克:行动
重写func viewDidLoad(){
super.viewDidLoad()
managedObjectContext=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
loadFloorData()
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
私有函数loadFloorData(){
let请求:NSFetchRequest=Floors.fetchRequest()
request.returnsObjectsAsFaults=false
做{
storedFloors=尝试managedObjectContext.fetch(请求)
self.tableView.reloadData()
}
抓住{
打印(“无法从core\(error.localizedDescription)加载数据”)
}
}
//标记:-表视图数据源
重写func numberOfSections(在tableView:UITableView中)->Int{
返回1
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回storedFloors.count
}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让cell=tableView.dequeueReusableCell(标识符为“floor cell”,for:indexPath)作为!FloorCell
让FloorWriteM=storedFloors[indexPath.row]
cell.floorNumberTxt.text=字符串(floorritem.floorNumber)
返回单元
}
此代码用于设置楼层数:

 @IBAction private func setTheNumberOfFloors(_ sender: UIButton) {
    let house = NSEntityDescription.insertNewObject(forEntityName: "House", into: managedObjectContext) as! House
    house.numberOfFloors = floorNumberValue
    print(" the number of floors in the house is: \(house)")

    loadFloorData()
    for floor in storedFloors {
        for i in 0...floor.numberOfFloors - 1 {
            let instance = NSEntityDescription.insertNewObject(forEntityName: "Floors", into: managedObjectContext) as! Floors
            instance.floorNumber = i
            print("\(instance)")
            house.addToFloors(instance)
        }
    }
 private func loadFloorData() {
    let request = NSFetchRequest<House>(entityName: "House")
    request.returnsObjectsAsFaults = false
    do {
        storedFloors = try managedObjectContext.fetch(request)
    }
    catch {
        print("could not load data from core \(error.localizedDescription)")

    }
}
@IBAction private func设置楼层数(u发送方:ui按钮){
let house=NSEntityDescription.insertNewObject(forEntityName:“house”,插入:managedObjectContext)作为!house
house.numberOfFloors=楼层编号值
打印(“房屋中的楼层数为:\(房屋)”)
loadFloorData()
用于存储楼层的地板{
对于0…楼层中的i。楼层数-1{
让instance=NSEntityDescription.insertNewObject(forEntityName:“Floors”,进入:managedObjectContext)作为!Floors
instance.floorNumber=i
打印(“\(实例)”)
house.addToFloors(实例)
}
}
私有函数loadFloorData(){
let request=NSFetchRequest(entityName:“房屋”)
request.returnsObjectsAsFaults=false
做{
storedFloors=尝试managedObjectContext.fetch(请求)
}
抓住{
打印(“无法从core\(error.localizedDescription)加载数据”)
}
}

正如Fahim所说,您需要为用于显示表的获取设置排序描述符:

request.sortDescriptors = [NSSortDescriptor(key: #keyPath(Floors.floorNumber), ascending: true)]
此外,请确保在插入新实体或进行任何修改后保存moc:

        do {
            try managedObjectContext.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
或者,如果您使用的是标准生成的代码:

UIApplication.shared.delegate.saveContext()

这一切都取决于这一行:
storedFloors=try managedObjectContext.fetch(请求)
。如果结果不正确,您需要找出原因。谢谢。我可以看到打印中创建的楼层数对象,它是正确的。我用来设置楼层数的是编辑的问题部分代码列表。这里肯定有问题,但我无法发现。如果您不介意的话请看我部分修复了它。我只是将实体描述init放入循环中。我确实获得了正确的行数,但顺序不正确。对于3个楼层,我得到了0 2 1。有人能告诉我为什么会发生这种情况吗?谢谢你能试着从loadFloorData()中移动重载调用self.tableView.reloadData()吗并在loadFloorData()调用后放入viewDidLoad。