需要更新tableView

Posted

技术标签:

【中文标题】需要更新tableView【英文标题】:Need to update tableView 【发布时间】:2015-12-03 23:04:20 【问题描述】:

我正在学习 Swift 编程,我从一本有错误的书中获得了这个示例(已评论)。按下Add 按钮时,如何解决此问题并更新tableView?我已经阅读了许多解决方案,但似乎没有一个有效。此外,tableView 在我重新加载 simulator 时更新。我已经被困了两天了,这让我发疯了! :)

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    var managedObjectContext: NSManagedObjectContext!


    override func viewDidLoad() 
        super.viewDidLoad()
        let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        managedObjectContext = appDelegate.managedObjectContext! as NSManagedObjectContext

        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func loadBooks() -> Array<AnyObject> 
        var error: NSError? = nil
        var fetchRequest = NSFetchRequest(entityName: "Book")
        let result: [AnyObject] = managedObjectContext!.executeFetchRequest(fetchRequest, error:&error)!
        return result
    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return loadBooks().count
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
        var book: Book = loadBooks()[indexPath.row] as! Book
        cell.textLabel!.text = book.title

        return cell
    

    @IBAction func addNew(sender: AnyObject) 
        let entity =  NSEntityDescription.entityForName("Book", inManagedObjectContext:managedObjectContext)
        var book = Book(entity: entity!,insertIntoManagedObjectContext:managedObjectContext)
        book.title = "My Book:" + String(loadBooks().count)
        var error: NSError?
        managedObjectContext.save(&error)
        myTableView.reloadData() //mistake!
    


【问题讨论】:

myTableViewDeclared在哪里? @MikeAtNobel 不是。也许在书籍编辑过程中丢失了一些代码,这不是第一次。我应该在哪里以及如何声明myTableView @Kie 对如何声明 myTableView 有一个很好的答案。但出于好奇,如果从未声明过 myTableView,它是如何编译的? @MikeAtNobel 没有这一行:) 【参考方案1】:

你必须为你的 tableview 声明一个 outlet,它可能设置在相应的故事板视图控制器中。

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    var managedObjectContext: NSManagedObjectContext!
    @IBOutlet weak var myTableView: UITableView!

    // your code

请不要忘记将情节提要中的表格视图实例与新创建的插座连接起来,方法是并排打开代码和情节提要并从插座旁边的点画一条线到表格视图。

或者您可以使用苹果在此处描述的方式 (https://developer.apple.com/library/ios/recipes/xcode_help-IB_connections/chapters/CreatingOutlet.html) 从情节提要的表格视图中创建您的出口。

【讨论】:

【参考方案2】:

编辑: 没关系,我意识到如果你没有连接数据源和委托,那么崩溃就会在 addNew() 之前发生。

Kie 的回答是正确的,但是要查看实际结果,您还需要将 tableView 的 dataSource 和委托连接到您的类。 您可以在情节提要中执行此操作,也可以在 viewDidLoad 方法中的代码中执行此操作。

override func viewDidLoad()
  super.viewDidLoad()
  myTableView.dataSource = self
  myTableView.delegate = self
  // Additional code

【讨论】:

以上是关于需要更新tableView的主要内容,如果未能解决你的问题,请参考以下文章

如何使 tableview 行高取决于其内容

iOS 8 具有可变高度的自调整单元格

更新查询需要 2 秒来更新表

苹果系统需要一直更新吗?

使用 DataSet 更新 TableAdapter - 更新需要有效的 DeleteCommand 错误

为啥需要更新器/更新函数来更新 React Relay 和 Apollo 客户端中的本地缓存?