2015-12-03 3 views
0

Я изучаю программирование в Swift, и у меня есть этот пример из книги с ошибкой (прокомментировано). Как я могу исправить это и обновить tableView, нажав кнопку Add? Я читал много решений, но никто не работает. Также, tableView обновляется при перезагрузке simulator. Я застрял с этим в течение двух дней, и это сводит меня с ума! :)Нужно обновить tableView

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! 
    } 

} 
+0

где находится 'myTableViewDeclared'? – dudeman

+0

@MikeAtNobel Это не было. Возможно, какой-то код был потерян во время редактирования книг, а не в первый раз. Где и как я должен объявлять 'myTableView'? – odvan

+0

@ Kie имеет хороший ответ о том, как объявить 'myTableView'. Но из любопытства, как это скомпилировано, если 'myTableView' никогда не был объявлен? – dudeman

ответ

1

Вы должны объявить свою розетку для вашего стола, которая, вероятно, установлена ​​в соответствующем контроллере представления раскадровки.

import UIKit 
import CoreData 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

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

    // your code 
} 

Пожалуйста, не забудьте подключить экземпляр вида таблицы из видеоредактора с вашей новосозданной розетки, открыв код и раскадровки бок о бок и нарисуйте линию от точки рядом с выходом к TableView.

Или вы можете использовать способ, которым описывается здесь яблоко (https://developer.apple.com/library/ios/recipes/xcode_help-IB_connections/chapters/CreatingOutlet.html), чтобы создать свою розетку со стола на раскадровке.

+0

Спасибо большое! Это работает. – odvan

0

Редактировать: Nevermind, я понял, что если бы вы не подключили dataSource и делегат, авария произошла бы раньше addNew().

Ответ Kie правильный, однако, чтобы увидеть фактический результат, вам также необходимо подключить dataSource и делегат tableView к вашему классу. Вы можете сделать это либо в раскадровке, либо в коде в методе viewDidLoad.

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