Ios 从核心数据获取和显示数据
目标: 能够在表视图的同一行中显示用户选择的日期和选择的时间。时间应显示在顶部,选择的日期应显示在底部,两者都在同一行中,就像闹钟一样 工作: 这就是我建立的关系: 这就是我在点击保存按钮时保存从UITable中选择的日期和UIDatepicker中选择的时间的方式:Ios 从核心数据获取和显示数据,ios,swift3,Ios,Swift3,目标: 能够在表视图的同一行中显示用户选择的日期和选择的时间。时间应显示在顶部,选择的日期应显示在底部,两者都在同一行中,就像闹钟一样 工作: 这就是我建立的关系: 这就是我在点击保存按钮时保存从UITable中选择的日期和UIDatepicker中选择的时间的方式: @IBAction func saveButnTapped(_ sender: AnyObject) { let context = (UIApplication.shared.delegate as!
@IBAction func saveButnTapped(_ sender: AnyObject)
{
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext //creates an object of a property in AppDelegate.swift so we can access it
let bob = Bob(context: context)
//save the time from UIDatePicker to core data
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
bob.timeToPing = dateFormatter.string(from: timePicked.date)
// save the days selected to core data
for weekday in filteredWeekdays
{
var day = Days(context: context) //create new Days object
day.daysSelected = weekday as NSObject? //append selected weekday
bob.addToTimeAndDaysLink(day) //for every loop add day object to bob object
}
//Save the data to core data
(UIApplication.shared.delegate as! AppDelegate).saveContext()
//after saving data, show the first view controller
navigationController!.popViewController(animated: true)
}
数据保存后,我得到了以下数据:
func getData()
{
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do
{
bobs = try context.fetch(Bob.fetchRequest())
}
catch
{
print("Fetching failed")
}
}
尝试获取所选日期:
我试图按照以下评论和以前删除的对此问题的回答来执行此操作:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = UITableViewCell()
let bob = bobs[indexPath.row]
cell.textLabel?.text = bob.timeToPing?.description
// retrieve the days that are selected
var daysArray: [Days] = []
daysArray = bob.timeAndDaysLink?.allObjects as! [Days]
for days in daysArray
{
print (days.daysSelected?.description)
cell.textLabel?.text = days.daysSelected! as! String
}
return cell
}
编辑:
print(daysArray)
提供以下信息:
[<Days: 0x6080000a5880> (entity: Days; id: 0xd000000000040000 <x-coredata://30B28771-0569-41D3-8BFB-D2E07A261BF4/Days/p1> ; data: <fault>)]
如何保存天数
let weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
var filteredWeekdays: [String] = []
@NSManaged public var daysSelectedbyUser: NSSet
然后
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
selectedWeekdays()
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
{
selectedWeekdays()
}
func selectedWeekdays()
{
if let selectedRows = tableView.indexPathsForSelectedRows
{
let rows = selectedRows.filter {$0.section == 0}.map{ $0.row}
filteredWeekdays = rows.map{ weekdays[$0] }
print(filteredWeekdays)
}
}
非常感谢 根据您最新的评论,确定崩溃发生在这一行:
cell.textlab?.text=days.value(forKey:“daySelected”)为!字符串
它清楚地指向你在“关键字名称”中的输入错误。您已经:daySelected
,并且应该(基于您的核心数据模型)选择daySelected
,但是,为核心数据实体使用值并强制输入这样的值并不是很好的方法。为了更好,我建议将此行替换为:
cell.textlab?.text=days.days已选中代码>
这应该已经是字符串
,因为这是CoreData
中的字符串。如果它是可选的(应该是可选的),您不应该强制它。我将假设,无论何时数据不存在,您都将只显示空单元格,因此更好的是:
cell.textLabel?.text=days.daysSelected??“”
无论何时(出于某种原因)数据不存在,这都会产生空字符串到文本
编辑
因此,对于您在问题中添加的其他代码:
在您的CoreData字段days中选择的是字符串的类型?
,对吗?
然后将timeAndDateLink
分配给NSSet
,对吗?但此处的期望值应为NSSet
因此,让我们稍微编辑一下输入代码(我将在每一行上添加注释):
我希望在上面的例子中一切都很清楚。在这种情况下,编译器可能会有问题,因为如果选择“为实体生成类”,最终将得到两个同名但参数不同的func
(在Swift中,这应该是两个不同的函数,但Xcode有时指向错误的函数)。如果遇到该问题,请尝试:
let bob = Bob(context: context) /* create new Bob object */
var output: NSMutableSet<Days> = NSMutableSet()
for weekday in filteredWeekdays {
var day = Days(context: context) /* create new Days object */
day.daysSelected = weekday /* append selected weekday */
output.add(day)
}
bob.addToTimeAndDaysLink(output) /* this will assign output set to bob object */
let bob=bob(context:context)/*创建新的bob对象*/
变量输出:NSMutableSet=NSMutableSet()
对于筛选的工作日工作日{
var day=Days(上下文:context)/*创建新的Days对象*/
day.daysSelected=weekday/*附加选定的工作日*/
输出。添加(天)
}
addToTimeAndDaysLink(output)/*这将把输出集分配给bob对象*/
您还应该将您的Days
实体重命名为Day
,以避免我们现在遇到的将来的混淆,Days
,因为数组将只与其他实体相关,而不是与该实体本身相关。我不知道为什么没有人使用FetchedResultsController,该控件用于将NSManagedObjects提取到tableView中,但我想这没关系
这个问题的问题是,您没有在这里发布变量的NSManagedObject类,所以我看不到您在这里设置的类型(应该在CoreData模型中可转换,在NSManagedObject类中[String]可转换…)
忽略所有的力展开和力施法以及混乱(你应该首先修复它,然后它至少不会崩溃,只是不显示任何数据…)
用户选择的天数是NSSet,它肯定不应该是NSSet
请在此处为您提供NSManagedObjectClass,以便我可以编辑此答案并解决您的问题…什么错误?并且您发布的代码不会出现在您的代码中。我想用bob
取代Salawat
?bobs
中的对象在哪里?什么是bobs=try context.fetch(Bob.fetchRequest())
?嗨@Larme,我刚刚更新了代码。抱歉,这是一个输入错误。您能显示bob
的值以及您收到的确切错误或警告消息吗?您好,我如何显示bob的值?我已经更新了原始问题,添加了确切的错误。我无法将它粘贴到这里,因为它太长了,不适合评论lol。bob.timeAndDaysLink
这是一个包含Days
对象的NSSet,而不是字符串对象的NSSet
,这就是为什么您会出现强制转换问题daysArray=bob.timeAndDaysLink?.allObjects.valueFor(关键字:“daysSelected”)
取而代之?谢谢你的回复,库巴。1. <代码>单元格.textLabel?.text=days.days已选中代码>给出了编译错误,所以Xcode建议我使用这个:cell.textLabel?.text=days.value(forKey:“daysSelected”)作为!字符串
。它编译正常,但在此行崩溃,出现错误无法将类型为“\uu NSSetI”(0x1033748b0)的值转换为“NSString”(0x10255eab8)
2<代码>单元格.textLabel?.text=days.days已选中代码>给出编译错误。所以我把它改为cell.textlab?.text=days.daysSelected!作为!字符串
在此行崩溃,出现错误无法将类型为“\uu NSSetI”(0x1023528b0)的值转换为“NSString”(0x10153cab8)
3daysSelected
是可转换的类型,不是可选的(我需要它不是可选的)。我将daysSelected
更改为一个字符串,并获得编译错误daysSelectedbyUser.daysSelected=NSSet(数组:filteredWeekdays)
说明无法将类型“NSSet”的值分配给类型字符串
您的“days”变量的类型是什么?你希望它是什么类型的?我相信它和你的是同一类型的
let bob = Bob(context: context) /* create new Bob object */
for weekday in filteredWeekdays {
var day = Days(context: context) /* create new Days object */
day.daysSelected = weekday /* append selected weekday */
bob.addToTimeAndDaysLink(day) /* for every loop add day object to bob object */
}
let bob = Bob(context: context) /* create new Bob object */
var output: NSMutableSet<Days> = NSMutableSet()
for weekday in filteredWeekdays {
var day = Days(context: context) /* create new Days object */
day.daysSelected = weekday /* append selected weekday */
output.add(day)
}
bob.addToTimeAndDaysLink(output) /* this will assign output set to bob object */