Ios 填充TableView中的JSON数组和CoreData

Ios 填充TableView中的JSON数组和CoreData,ios,json,swift,uitableview,core-data,Ios,Json,Swift,Uitableview,Core Data,很抱歉给您带来不便,我是iOS初学者,有一个问题 我有一个JSON、CoreData和TableView,JSON从web获取并保存在Documents文件夹中。之后,必须使用它填充CoreData和TableView中JSON保存的一些值。F.E.我们以一个事件为标题 我有一个控制器: import Foundation import UIKit import CoreLocation import CoreData class QuestListViewController: UIView

很抱歉给您带来不便,我是iOS初学者,有一个问题

我有一个JSON、CoreData和TableView,JSON从web获取并保存在Documents文件夹中。之后,必须使用它填充CoreData和TableView中JSON保存的一些值。F.E.我们以一个事件为标题

我有一个控制器:

import Foundation
import UIKit
import CoreLocation
import CoreData

class QuestListViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

let eventscd = [Events]()

@IBOutlet weak var questsTabBarItem: UITabBarItem!

var questCode : String = ""

var numberofcells:Int = 0

@IBOutlet weak var tableView: UITableView!

var numbers:[String] = []

override func viewDidLoad() {
    super.viewDidLoad()

    let entity = NSEntityDescription.entityForName("Events", inManagedObjectContext: managedObjectContext!)

    let events = Events(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

    var error: NSError?
    var jsonError:NSError?
    let jsonBundle = NSBundle.mainBundle()
    let jsonFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]as! String
    let jsonPath = jsonFolder.stringByAppendingPathComponent("\(self.questCode).json")

    if let data = NSData(contentsOfFile:jsonPath, options:NSDataReadingOptions.DataReadingUncached, error:&jsonError) {

        let stringData = NSString(data: data, encoding: NSUTF8StringEncoding)

        let jsonDict : NSDictionary? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &jsonError) as? NSDictionary

        if let err = jsonError {
            println("error parsing json")
        }

        if let jsonDictionary = jsonDict {
            println("json parsed successfully")

            let json_data = JSON(jsonDictionary).arrayValue

            let id = jsonDictionary["id"]!.stringValue
            let version: AnyObject = jsonDictionary["version"]!
            let title: AnyObject = jsonDictionary["title"]!
            let description: AnyObject = jsonDictionary["description"]!
            let events_json = jsonDictionary["events"] as! NSArray
            let eventNumber: NSNumber = jsonDictionary["events"]!.count as NSNumber
            self.numberofcells = events_json.count

        }

    }


    // 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.
}
// MARK: - Table view data source
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)

    let row = indexPath.row

}

// MARK: - Set number of rows
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.numberofcells
}

// MARK: - Create cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
    cell.backgroundColor = UIColor.clearColor()
    cell.backgroundView = UIView.new()
    cell.selectedBackgroundView = UIView.new()

    var imageView = UIImageView(frame: CGRectMake(10, 10, cell.frame.width - 0.3, cell.frame.height - 0.3))
    let image = UIImage(named: "event_list_cell.png")
    imageView.image = image
    cell.backgroundView = UIView()
    cell.backgroundView!.addSubview(imageView)
    var row = indexPath.row
    let eventsc = eventscd[indexPath.row]  /////HERE IS FATAL BREAKPOINT

//        cell.textLabel?.text = eventTable[row] as? String
    cell.textLabel?.text = eventsc.valueForKey("event_title")![row] as? String

    return cell
}

}
事件类: 进口基金会 导入CoreData

@objc(Events) class Events: NSManagedObject {

    @NSManaged var title: String
    @NSManaged var event_title: String

}
和CoreMap:

并有一个错误:

On line with "let eventsc = eventscd[indexPath.row]" in Controller
Output: "fatal error: Array index out of range"

我错在哪里?

这是因为在
视图didload
中,您正在将
numberOfCells
设置为一个大于0的值。但是
eventscd
中没有任何内容。这就是为什么在尝试从
eventscd
读取值时,会出现索引超出范围的错误


理想情况下,返回的行数应该是
eventscd。count
eventscd
应该在加载表内容之前填充(或者在获取数据并向
eventscd
添加值后重新加载表)

应该使用
NSFetchedResultsController
填充表视图。查看Xcode模板(新建项目->主详细信息->检查“使用核心数据”),并检查主控制器


这比使用阵列要好得多(性能、内存、可维护性)

您在哪里将值放入
eventscd
?数组
eventscd
在哪里填充?我了解了
eventscd
,但几乎不是您所说的全部内容)我应该如何表示TableCells?使用另一个var/let或以某种方式转换
eventscd
?您需要从任何地方向
eventscd
添加数据。如果events_json包含数据,则使用该数据填充eventscd。或者如果你必须从CoreData获取数据,那么就这样做。现在我很难理解别人的代码)试图用自己的文档编写。。。我需要用事件标题填充它,我在json事件[[..,title1,…],[..,title3,…],[..,title3,…]中有它,这是个坏主意。忽略苹果的参考实现,后果自负。是的,我知道,但我只需要这些单元格显示“事件标题”