核心数据导致 iPhone 崩溃
Core data is causing the iPhone crash
我在将数据保存到 Core Data 时没有问题。
我的问题是 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
{
}
table 查看
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
但我在应用程序中只有一个数据。 table 也没有填充
你什么时候打电话给var item = [ItemInCard]()
?
如果
let fetchRequest : NSFetchRequest<ItemInCard> = ItemInCard.fetchRequest()
在
之前调用
var item = [ItemInCard]()
那么你找到问题了。
在 self.item = itemIncard
之后调用 var item = [ItemInCard]()
将创建一个新实例并否定放入 self.item
的任何内容。
另外 post item.count
returns 可以进一步帮助您解决问题。编码愉快!
从您的 cellForRowAt 方法中删除对 reloadData 的调用。当应用程序需要重新加载 tableView 时调用 cellForRowAt。实际上,您是在告诉它在创建每个单元格后开始重新加载,这样您就永远不会超过第一个单元格。这就解释了为什么您只看到一项。
不要在 cellForRowAt
方法中调用 tableView.reloadData()
。因为它会导致 tableView 在每次尝试加载单元格时重新加载。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ShoppingCardCell") as? ShppingCellCustomTableViewCell
cell!.textLabel?.text = item[indexPath.row].productTitleCore
//Remove or comment this line self.Tableview.reloadData()
self.Tableview.reloadData()
return cell!
}
我在将数据保存到 Core Data 时没有问题。 我的问题是 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
{
}
table 查看
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
但我在应用程序中只有一个数据。 table 也没有填充
你什么时候打电话给var item = [ItemInCard]()
?
如果
let fetchRequest : NSFetchRequest<ItemInCard> = ItemInCard.fetchRequest()
在
之前调用var item = [ItemInCard]()
那么你找到问题了。
在 self.item = itemIncard
之后调用 var item = [ItemInCard]()
将创建一个新实例并否定放入 self.item
的任何内容。
另外 post item.count
returns 可以进一步帮助您解决问题。编码愉快!
从您的 cellForRowAt 方法中删除对 reloadData 的调用。当应用程序需要重新加载 tableView 时调用 cellForRowAt。实际上,您是在告诉它在创建每个单元格后开始重新加载,这样您就永远不会超过第一个单元格。这就解释了为什么您只看到一项。
不要在 cellForRowAt
方法中调用 tableView.reloadData()
。因为它会导致 tableView 在每次尝试加载单元格时重新加载。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ShoppingCardCell") as? ShppingCellCustomTableViewCell
cell!.textLabel?.text = item[indexPath.row].productTitleCore
//Remove or comment this line self.Tableview.reloadData()
self.Tableview.reloadData()
return cell!
}