我在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!
}
}
答案 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
}