核心数据导致iPhone崩溃

时间:2018-09-24 07:21:41

标签: swift uitableview core-data iphonecoredatarecipes

将数据保存到核心数据上没有问题。 我的问题是应该从该vc中获取数据。

CoreData

@objc(ItemInCard)
public class ItemInCard: NSManagedObject {

}

FETCH

let fetchRequest : NSFetchRequest<ItemInCard> = ItemInCard.fetchRequest()
    do
    {
        let itemIncard = try  PersistanceService.context.fetch(fetchRequest)
        self.item = itemIncard
        self.Tableview.reloadData()
    }
    catch
    {

    }

表格视图

var item = [ItemInCard]()
    //MARK: - Table view
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    print("=======")
    print(item)
    return item.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ShoppingCardCell") as? ShppingCellCustomTableViewCell


    cell!.textLabel?.text = item[indexPath.row].productTitleCore

    self.Tableview.reloadData()
    return cell!
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 180
}

只要该vc在应用程序中处于打开状态,它就会打印核心数据(我添加了打印内容以检查发生了什么情况

它一直在下面打印核心数据

[<ItemInCard: 0x281a4efd0> (entity: ItemInCard; id: 0x87c125f9e2c25dff <x-coredata://139AE9B3-30B6-4857-8313-456481AF833C/ItemInCard/p1> ; data: {
    paymentTypeCore = "\U0648\U0627\U0631\U064a\U0632\U064a";
    priceCore = 10000;
    priceTypeCore = "\U0639\U0627\U062f\U06cc-test";
    productTitleCore = "\U062c\U0648 \U0627\U06a9\U0631\U0627\U06cc\U0646 \U0628\U0646\U062f \U0627\U0645\U0627\U0645 \U062a\U062d\U0648\U06cc\U0644 \U0645\U0647\U0631\U

但是我的应用程序中只有一个数据。表格也没有填充

3 个答案:

答案 0 :(得分:2)

从cellForRowAt方法中删除对reloadData的调用。当应用需要重新加载tableView时,将调用cellForRowAt。实际上,您是在告诉它在创建每个单元之后开始重新加载,因此您永远不会越过第一个单元。这说明了为什么您只看到一项。

答案 1 :(得分:1)

您何时致电var item = [ItemInCard]()

如果

let fetchRequest : NSFetchRequest<ItemInCard> = ItemInCard.fetchRequest()

之前被调用
var item = [ItemInCard]()

然后您发现了问题。

var item = [ItemInCard]()之后调用self.item = itemIncard将创建一个新实例,并取消放入self.item中的所有内容。

还要发布item.count返回的内容,以进一步解决您的问题。祝您编码愉快!

答案 2 :(得分:1)

请勿在{{1​​}}方法中调用tableView.reloadData()。因为它将导致tableView在每次尝试加载单元格时重新加载。

cellForRowAt