swift - CoreData/TableView - 'subscript' 的使用不明确

标签 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")
        }
    }
}

最佳答案

你有这个声明:

var eventItems: AnyObject?

然后您稍后执行此操作:

let eventItem = eventItems! [indexPath.row] 

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

由于您要将 eventItems 作为获取请求的结果进行分配,因此应将其声明为 NSArray? 或类似 [Event] 的内容?。此外,在 eventItems 之后使用 ! 会使您面临严重的崩溃风险;永远不要使用 ! 除非你绝对确定你不会意外地得到一个 nil 值。

关于swift - CoreData/TableView - 'subscript' 的使用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148813/

相关文章:

swift - 将事件绑定(bind)到 Observable<JSON> 的键

ios - 选择一行是检查另一行的标记

ios - 为什么我在滚动后在 UITableViewCell 中得到双重内容? ( swift )

iphone - 无法在 Interface Builder 中更改 UITableViewCell 大小

ios - CoreData IOS9 错误?

ios - 如何在等待核心数据/网络请求时在状态恢复期间显示加载微调器?

ios - didSelectItemAt 未被调用

iOS 10 : Receive Remote Notification in background

ios - 在 UITableViewCell 中,如何将单击按钮的样式更改为粗体,而其他单元格保持不变?

objective-c - NSSortDescriptor - 按位置排序