CoreData / TableView - 模糊地使用'下标'

时间:2016-08-25 15:07:49

标签: swift uitableview core-data

当我尝试使用CoreData数据创建TableView时,我收到此错误,并且不知道如何修复它。我将CoreData保存在另一个类中。我不知道我是否正确创建了TableView。

class listEvents: UITableViewController {

    var logTableView = UITableView(frame: CGRectZero, style: .Plain)
    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    var eventItems: AnyObject?

    override func viewDidLoad() {
        super.viewDidLoad()

        var viewFrame = self.view.frame

        viewFrame.origin.y += 20

        viewFrame.size.height -= 20


        logTableView.frame = viewFrame

        self.view.addSubview(logTableView)

        logTableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "EventCell")


        logTableView.dataSource = self

        fetchLog()

    }

    override func viewDidAppear(animated: Bool) {


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return eventItems!.count

    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("EventCell") as! UITableViewCell!

        let eventItem = eventItems! [indexPath.row] <-- Error here

        cell.textLabel?.text = eventItem.name
        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let eventItem = eventItems! [indexPath.row] <-- Error here
        print(eventItem.id)
    }


    func fetchLog() {
        let fetchRequest = NSFetchRequest(entityName: "Event")


        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)


        fetchRequest.sortDescriptors = [sortDescriptor]

        do{
        if let fetchResults = try managedObjectContext.executeFetchRequest(fetchRequest) as? [Event] {
            eventItems = fetchResults
        }
        }catch{
        print("ERROR")
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你有这个声明:

var eventItems: AnyObject?

然后你会这样做:

let eventItem = eventItems! [indexPath.row] 

问题是您将eventItems声明为AnyObject?,而AnyObject不接受下标。它可以完全是任何对象,并不是每个类都使用下标,所以Swift不知道该怎么做。

由于您将eventItems指定为获取请求的结果,因此应将其声明为NSArray?或类似[Event]?。此外,在!之后使用eventItems会使您面临严重的崩溃风险;不要使用!,除非你绝对确定你不会意外地获得零值。