填充 TableView 中的 JSON 数组和 CoreData

Posted

技术标签:

【中文标题】填充 TableView 中的 JSON 数组和 CoreData【英文标题】:JSON Array and CoreData in populating TableView 【发布时间】:2015-07-07 13:36:49 【问题描述】:

抱歉给您带来不便,我是 ios 初学者,遇到问题...

我有一个 JSON、CoreData 和 TableView,JSON 从 Web 获取并保存在 Documents-Folder 中。之后,必须用它填充 CoreData 和 TableView 中保存的 JSON 中的一些值。 F.E. 我们采用 event_title..

我有一个控制器:

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



事件类: 进口基金会 导入核心数据

@objc(Events) class Events: NSManagedObject 

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


还有一个 CoreMap: http://i.imgur.com/5iKwAyn.png

还有一个错误:

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

我哪里错了?

【问题讨论】:

你把值放在eventscd的什么地方? 数组eventscd在哪里填充? 【参考方案1】:

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

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

【讨论】:

我知道了eventscd,但几乎没有你所说的一切)我应该如何表示 TableCells?使用另一个 var/let 或以某种方式转换 eventscd? 您需要从您获取此数据的任何位置将数据添加到eventscd。如果 events_json 有数据,使用它来填充 eventscd。或者,如果您必须从 CoreData 获取数据,请执行此操作。【参考方案2】:

您应该使用NSFetchedResultsController 填充您的表格视图。查看 Xcode 模板(New Project -> Master-Detail -> 检查“Use Core Data”)并检查主控制器。

这比使用数组要好得多(性能、内存、可维护性)。

【讨论】:

我现在很难理解其他人的代码)尝试用我自己的文档编写...我需要用 event_title 填充它,我在 json 事件[[.... ,title1,....],[....,title3,....],[....,title3,....]] 坏主意。忽略 Apple 的参考实现,后果自负。 是的,我知道,但我只需要这些单元格显示“event_title”

以上是关于填充 TableView 中的 JSON 数组和 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

获取 JSON 数据以从数组中填充 TableView

在 Swift 中的数组中使用多个部分和多个字典填充 TableView

我如何解析 JSON,将其排序为数组。提取数据并填充到表格视图中?

使用 JSON 和 AFNetworking NSDictionary 使用数据填充 tableview

您好,我是 iOS 开发新手,我很难用 json 数据填充嵌入在 UIviewcontroller 中的 tableview

json数据填充和多选以获取ID