- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题总结
我正在编写一个iOS应用程序,就像待办事项列表和日历之间的混合体。与待办事项列表不同,您不需要将所有内容都检查完整。而是将待办事项放置在UITableView中用于活动和非活动的部分中。问题是该节和排序可能相对于当前日期和时间在任何时间发生变化。
因此,当前在获取数据之后但视图控制器开始显示它之前,在初始应用程序加载时如何以及何时刷新section / nextAlert日期,目前我一直在苦苦挣扎。
我尝试过的背景
我已经研究并尝试了许多不同的方法来解决这些问题。
提取后在viewDidLoad中刷新。我试图在viewDidLoad期间在表视图控制器中获取数据后立即调用refreshReminders函数。只要我实际上没有在该函数中保存到核心数据,这似乎就可以正常工作。只需在一个或多个记录上设置字段即可触发控制器,并且行将按其应有的方式移动和更新。尽管看起来加载顺序可能为时已晚。我们是否真的希望表视图在应用程序首次启动时必须正确地移动记录?这听起来像是不好的做法。
现在,如果我尝试在刷新后将更改保存到核心数据,那么它就变得很奇怪。该表显然是根据当前上下文中记录的更改来更新的,但是当上下文被保存时,它将再次触发更改!由于已经进行了更改,因此在尝试将行从旧位置移动到新位置后,该应用程序崩溃。请参见下面的代码。
在获取唤醒之前刷新。我还尝试使用对核心数据对象的扩展(提醒)来设置节和nextAlert日期。但是,这似乎没有任何作用。即,该表仍然以错误的部分和/或排序顺序加载了提醒。
刷新此处的字段也不会将数据标记为“脏”(已更改),因此表视图控制器不会移动它,并且仅当数据为脏时才触发的上下文保存当然不会触发。我什至尝试在获取后保存上下文,而无需检查其是否已更改,但这也不起作用。也就是说,即使核心数据确实没有任何变化,它也确实没有任何变化。
这是代码
这是我的tableViewController的控制器函数中的.move情况
case .move:
if let oldPath = indexPath, let newPath = newIndexPath {
os_log("RemindersViewController: Move was triggered, now updating row in table. Old path was %{public}@ and new path is %{public}@", log: OSLog.default, type: .info, oldPath as CVarArg, newPath as CVarArg)
RemindersCell, withReminder: anObject as! Reminders)
configureCell(tableView.cellForRow(at: oldPath) as! RemindersCell, withReminder: anObject as! Reminders)
os_log("RemindersViewController: updated moved cell.", log: OSLog.default, type: .info)
// Don't actually try to move it if the old and new path are the same
if (newPath != oldPath) {
os_log("RemindersViewController: Moving row in table.", log: OSLog.default, type: .info)
tableView.moveRow(at: oldPath, to: newPath)
os_log("RemindersViewController: row moved.", log: OSLog.default, type: .info)
}
}
func configureCell(_ cell: RemindersCell, withReminder reminder: Reminders) {
cell.labelTitleField!.text = reminder.title ?? "New Reminder"
cell.labelAlertField!.text = reminder.nextAlert!.description
}
// Batch the updates to the table. Start with beginUpdates so all the action animations are queued up.
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
// Batch the updates to the table. End with endUpdates to trigger the actual animations.
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
2019-03-23 12:31:09.307801-0500 Scheduler[5711:2218287] RemindersViewContoller in viewDidLoad: Fetched records successfully.
Refreshing reminders!
2019-03-23 12:31:09.311755-0500 Scheduler[5711:2218287] Reminder 'Test Non-recurring Reminder' section updated to Inactive.
2019-03-23 12:31:09.313254-0500 Scheduler[5711:2218287] RemindersViewController: Move was triggered, now updating row in table. Old path was <NSIndexPath: 0x28078e480> {length = 2, path = 0 - 0} and new path is <NSIndexPath: 0x28078f140> {length = 2, path = 1 - 2}
Scheduler was compiled with optimization - stepping may behave oddly; variables may not be available.
(lldb)
// Handle updating nextAlert and section based on current date and time
func refreshReminders () {
// Loop through the records and update the time-sensitive section and nextAlert fields
print("Refreshing reminders!")
for reminder in fetchedController.fetchedObjects! {
if (reminder.nextAlert! < Date()) {
if (reminder.recurrence != "Never") {
let nextAlert = nextAlertDate(alertDate: reminder.alert!, recurrencePattern: reminder.recurrence)
if (reminder.nextAlert != nextAlert) {
reminder.nextAlert = nextAlert
os_log("Reminder '%{public}@' nextAlert date updated to %{public}@.", reminder.title!, String(describing: reminder.nextAlert!))
}
}
let section = getSection(nextAlertDate: reminder.nextAlert!)
if (reminder.section != section) {
reminder.section = section
//print("Reminder section updated to", reminder.section!)
os_log("Reminder '%{public}@' section updated to %{public}@.", reminder.title!, reminder.section!)
}
}
} //endfor
// Save changes to core data if there are any
/*if context.hasChanges {
do {
try context.save()
print("RemindersViewController in refreshReminders: Changes to core data, so saving them now.")
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
} //enddo
}*/ //endif
} //endfunc refreshReminders
2019-03-23 18:26:24.796406-0500 Scheduler[6383:2371662] AppDelegate: Initialized core data stack
2019-03-23 18:26:24.801211-0500 Scheduler[6383:2371734] AppDelegate: Notification authorization granted.
2019-03-23 18:26:24.806165-0500 Scheduler[6383:2371734] AppDelegate: Set our custom notification categories and actions.
2019-03-23 18:26:24.810726-0500 Scheduler[6383:2371662] RemindersViewContoller in viewDidLoad: Fetched records successfully.
Refreshing reminders!
2019-03-23 18:26:24.814331-0500 Scheduler[6383:2371662] Reminder 'Test Non-recurring Reminder' section updated to Inactive.
Number of sections: 2
2019-03-23 18:26:24.815463-0500 Scheduler[6383:2371662] RemindersViewController in viewWillAppear: We're here. Let's see how often we get triggered!
Number of sections: 2
Number of records in section 1 : 3
Number of records in section 0 : 7
Number of sections: 2
Number of records in section 1 : 3
Number of records in section 0 : 7
2019-03-23 18:26:24.893329-0500 Scheduler[6383:2371662] RemindersViewController: Move was triggered, now updating row in table. Old path was <NSIndexPath: 0x28047a900> {length = 2, path = 0 - 0} and new path is <NSIndexPath: 0x28047a920> {length = 2, path = 1 - 3}
2019-03-23 18:26:24.893498-0500 Scheduler[6383:2371662] RemindersViewController: updated moved cell.
2019-03-23 18:26:24.893511-0500 Scheduler[6383:2371662] RemindersViewController: Moving row in table.
2019-03-23 18:26:24.893524-0500 Scheduler[6383:2371662] RemindersViewController: row moved.
Number of sections: 2
Number of sections: 2
Number of records in section 0 : 6
Number of records in section 1 : 4
2019-03-23 18:35:22.210467-0500 Scheduler[6396:2375020] AppDelegate: Initialized core data stack
2019-03-23 18:35:22.215964-0500 Scheduler[6396:2375092] AppDelegate: Notification authorization granted.
2019-03-23 18:35:22.220937-0500 Scheduler[6396:2375092] AppDelegate: Set our custom notification categories and actions.
2019-03-23 18:35:22.227273-0500 Scheduler[6396:2375020] RemindersViewContoller in viewDidLoad: Fetched records successfully.
Refreshing reminders!
2019-03-23 18:35:22.230832-0500 Scheduler[6396:2375020] Reminder 'Test Non-recurring Reminder' section updated to Inactive.
2019-03-23 18:35:22.232326-0500 Scheduler[6396:2375020] RemindersViewController: Move was triggered, now updating row in table. Old path was <NSIndexPath: 0x282e6d360> {length = 2, path = 0 - 0} and new path is <NSIndexPath: 0x282e6df60> {length = 2, path = 1 - 3}
Scheduler was compiled with optimization - stepping may behave oddly; variables may not be available.
(lldb)
configureCell(tableView.cellForRow(at: oldPath) as! RemindersCell, withReminder: anObject as! Reminders)
Thread 1: EXC_BREAKPOINT (code=1, subcode=0x104048220)
最佳答案
事实证明,即使单元格本身为零,也可以发送移动行请求。 PaulW11指出,这很可能是因为该单元实际上尚未在屏幕上可见。因此,处理此问题的方法是,当且仅当它不是nil时才更新(配置)单元格,但是只要我们有一个有效的oldPath和newPath,就继续处理该行的移动。我更新的效果很好的代码是:
case .move:
// If we have an old and new path, proceed with moving and/or updating the cell
if let oldPath = indexPath, let newPath = newIndexPath {
if let cell = tableView.cellForRow(at: oldPath) as? RemindersCell, let reminder = anObject as? Reminders {
os_log("RemindersViewController: Move was triggered, so updating cell in table. Reminder is: %{public}@", log: .default, type: .info, reminder)
configureCell(cell, withReminder: reminder)
os_log("RemindersViewController: Updated moving cell.", log: .default, type: .info)
} else {
os_log("RemindersViewController: Move triggered, but cell isn't yet visible so skipping updating the cell fields.")
}
// If we have an old and new path, then go ahead and move the cell
os_log("RemindersViewController: Moving row in table.", log: .default, type: .info)
tableView.moveRow(at: oldPath, to: newPath)
os_log("RemindersViewController: Row moved from %{public}@ to %{public}@.", log: .default, type: .info, oldPath as CVarArg, newPath as CVarArg)
// If old and new path invalid, then log that
} else {
os_log("RemindersViewController: Move triggered, but old and new path aren't filled, so ignoring it.", log: .default, type: .error)
}
break
关于ios - 在获取核心数据之后但在显示 TableView 之前,如何更新依赖于当前时间的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55318631/
我正在对 tableView 是否呈现单元格进行单元测试。 我发现 tableView.cellForRow(at:) 返回 nil,而 tableView.dataSource?tableView(
我有 Tableview 用于显示客户下的食品订单。其中包含水平 UIStackview。在 UIStackView UIStackview 中很少有一/两行标签和一个用于显示订单项的UITableV
我有 Viewcontroller,我在其中设置了 ScrollView 。在 scrollview 中,我有一个 tableview,它位于 Container 中,就在容器下方,当我将 table
我想在滚动时让我的第一个单元格始终位于 tableview 的顶部。 任何帮助都是可观的。提前致谢... 最佳答案 这是为 UITableView 创建标题 View 的方法 - (UIView *)
在我的应用程序中,我点击一行,它会在其下方展开另一行。我想生成一种随机颜色,当我单击一行时,行背景会变成该颜色,而它下面的展开行会变成相同的颜色。如何让行生成相同的随机颜色? 我创建了一个函数来生成随
我正在为这个问题苦苦挣扎,所以我需要你的帮助。基本上我已经编写了一个复杂的 TableView Controller (使用 NSFetchedResults 协议(protocol)等)并且已经在我
我正在使用 JavaFx 2.2。我遇到了一个问题,我无法在 TableView 列中放置不同的组件。例如我有两列 1) 回答 2) 答案类型 如果 AnswerType 包含“Multiple Ch
试图弄清楚如何在 javafx 2 中禁用表列的重新排序? 最佳答案 这是解决方案: tblView.getColumns().addListener(new ListChangeListener()
我一直在寻找有关将数据刷新到 tableview 的信息。我试图直接修改模型,但我遇到了一个错误。我修改了模型,但表格没有刷新,只有当我移动一列时,表格才会显示修改后的值。 为了给你展示一个例子(13
给定一个TableView,我需要检测单元格上的双击。 tableView.setOnMouseClicked(new EventHandler() { @Override publi
我成功创建了一个 TableView,其中将特定列分配给了数据模型类。该程序可以将 csv 文件解析为其中并在表中正确显示所有内容。在此阶段,滚动不是问题。 然后我想选择特定行并将它们发送到另一个表。
我尝试了所有方法来用数据填充 TableView。下一个代码在表中插入一个新行,但数据没有出现在表中。我试图为此找到解释,但没有成功。 请帮忙。我不知道怎么了。 在 controller.java 中
我尝试了所有方法来用数据填充 TableView。下一个代码在表中插入一个新行,但数据没有出现在表中。我试图为此找到解释,但没有成功。 请帮忙。我不知道怎么了。 在 controller.java 中
我有一个通过 Tableview 显示玩家的应用程序。用户可以“添加”一个新玩家并输入他的姓名、高度、体重、图片等...保存后将被添加到 Tableview 中。他们还可以点击每个玩家,然后将他们带到
对于大学,我必须编写一个小应用程序,其想法是创建一个小公式集合。这个概念是有一个类别列表,选择类别后您会收到一个公式列表。选择所需的公式后,您将看到公式计算器的 View 。 我正在努力获得第一个UI
如果我只加载一个 TableView ,我的 View 中必须有两个 TableView ,它工作正常。但是当我尝试使用下面的方法加载两个表格 View 时,它给出了以下异常。 未捕获异常“NSRan
我是 JavaFx 的新手,我正在尝试创建一个 TableView ,而 fxml 是使用场景生成器创建的。如果我运行该程序,该表不会获取值。我发现这个问题在某种程度上符合我的要求( javaFX 2
是否可以对 tableView 进行反向排序?我搜索了很多解决方案,但没有任何效果。 效果就像whatsapp聊天。 一个普通的tableView是: ---------- label 1 -----
我有一个有趣的问题。我有两个 TableView ,一个在另一个里面。我有一个结构,我想用它来将数据添加到我的 TableView 中。该结构有 2 个字符串项和另一个具有 3 个字符串项的结构的数组
我正在使用的方法 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath
我是一名优秀的程序员,十分优秀!