需要更新tableView

时间:2015-12-03 23:04:21

标签: swift tableview reloaddata

我在Swift学习编程,我从一本有错误的书中得到了这个例子(评论)。如何解决此问题并在按下tableView按钮时更新Add?我已经阅读了很多解决方案,但似乎都没有。此外,我重新加载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!
    }

}

2 个答案:

答案 0 :(得分:1)

您必须声明您的桌面视图的出口,这可能是在相应的故事板视图控制器中设置的。

{{1}}

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

或者您可以使用Apple在此处描述的方式(https://developer.apple.com/library/ios/recipes/xcode_help-IB_connections/chapters/CreatingOutlet.html)从故事板上的表格视图创建插座。

答案 1 :(得分:0)

编辑: 没关系,我意识到,如果你不能连接dataSource和委托,崩溃将在addNew()之前发生。

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

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