Ios 从核心数据获取和显示数据

Ios 从核心数据获取和显示数据,ios,swift3,Ios,Swift3,目标: 能够在表视图的同一行中显示用户选择的日期和选择的时间。时间应显示在顶部,选择的日期应显示在底部,两者都在同一行中,就像闹钟一样 工作: 这就是我建立的关系: 这就是我在点击保存按钮时保存从UITable中选择的日期和UIDatepicker中选择的时间的方式: @IBAction func saveButnTapped(_ sender: AnyObject) { let context = (UIApplication.shared.delegate as!

目标:

能够在表视图的同一行中显示用户选择的日期和选择的时间。时间应显示在顶部,选择的日期应显示在底部,两者都在同一行中,就像闹钟一样

工作:

这就是我建立的关系:

这就是我在点击保存按钮时保存从UITable中选择的日期和UIDatepicker中选择的时间的方式:

@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)
3
daysSelected
是可转换的类型,不是可选的(我需要它不是可选的)。我将
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 */