Swift:table 视图中的自定义 class 数组 - 编辑值:附件 segue 或其他?
Swift: Custom class array in table view - editing the values: accessory segue or other?
我有一个自定义 class 带有变量名称和说明的药物。我把它放在一个数组中,在显示 Medication.name 和 Medication.directions.
的表视图中显示
我希望用户能够单击行或附件按钮(详细信息?)以编辑所选行中的值。
我的理想情况是一个菜单,它从选定行的底部下拉,带有可编辑的字段,可以更新数组中的行并重新加载表视图。
有没有办法完成这个或类似的事情?我正在玩弄隐藏的视图字段并让它们在选择行时显示,但我不确定我是否可以将一个锚定到所选行的底部?或者我可以构建一个自定义单元格,在每个单元格中隐藏可编辑字段,单元格具有固定高度,单击它时会发生变化以显示额外字段。
同样,如果最好的选择是使用辅助视图,那么Detail是否最合适?我似乎无法为此右键单击并拖动 segue。或者我会在下面使用这个吗?
optional func tableView(_ tableView: UITableView,
accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath)
如果我将其转移到另一个视图控制器,显然我需要使用委托来更改表视图中的数组,因此我希望找到一个更简单的解决方案。
谢谢!感谢这位新手的任何提示
这是我遇到问题的地方:
let vc = segue.destinationViewController as! MedDetailViewController
vc.delegate = self
let MedRow = self.tableView.indexPathForSelectedRow()!
let passMed = myMedsList[MedRow] //this row doesn't work
vc.detailMed = passMed
segue 不仅是完成此操作的最简单方法,您还可以利用 unwind segue 自动 return 您编辑的值。
不需要委派。没有用于将隐藏视图添加到您的单元格的自定义代码。
如果您只有一个 segue,请将其添加到该行,而不是附件。用户倾向于期望点击该行会有所作为。如果它什么也没做,大多数用户就不会尝试点击配件。
点击配件是一种辅助动作,与点击行不同。
我会在 Storyboard 中设置 show
segue。编写的代码更少,维护的代码更少。让 Storyboard 为您完成工作。
更新:
这是 Apple 关于 Using Unwind Segues 的技术说明,以及目标(呈现)视图控制器如何从源(呈现)视图控制器访问数据的 Swift 示例。
@IBAction func unwindToMainMenu(sender: UIStoryboardSegue)
{
let sourceViewController = sender.sourceViewController as! MedDetailViewController
// Update the medsList array with the new detailMed
let medRow = self.tableView.indexPathForSelectedRow().row
medsList[medRow] = sourceViewController.detailMed
}
更新二:
您想在展开 segue 之前更新详细视图控制器的 detailMed 属性,使用 prepareForSegue: 方法。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "unwindToMedications"
{
// Update the detailMed if the user has edited it
self.detailMed = ... // the edited medication you're returning
}
}
更新 3:
后退按钮(或向后轻扫)只是将推送的视图控制器从堆栈中弹出,但没有被调用的 segue。您需要明确地从完成按钮连接一个 segue,这将为您放松并更新药物列表。
显式展开的原因是为了区分用户是要提交还是取消任何更改。 (他们是否做了更改,但他们想忽略它,所以他们按了返回?)
您有两个选项,两者都可以使用,这取决于您要如何呈现可编辑的详细信息。 (我更喜欢用 push 来显示细节,用 modal 来编辑表单,但是这两种方法都可以)。
推送详细视图控制器。有一个完成按钮。用户可以使用“后退”按钮取消,或使用“完成”按钮接受任何更改的医疗详细信息。
显示带有取消和完成按钮的模态视图控制器。同样,用户可以取消(return 没有更改),或点击完成以(return 和)接受更改。
对于任一演示文稿,您都将展开转场连接到“完成”按钮。这将做的是调用 Meds 列表视图控制器展开操作。在该展开代码中,您可以获取药物详细信息并更新药物列表,正如我们之前讨论的那样。
关于核心数据的提及:
有一种替代方法并不比 segues 更容易学习,但它非常适合。 (要记住的事情,如果不是这个应用程序,那么下一个。)
核心数据和 NSFetchedResultsController
。您保存编辑后的药物,NSFetchedResultsControllerDelegate
为您更新药物列表。
有些人可能会说这太过分了,但自从我开始使用 NSFetchedResultsController 以来,我希望我早点学会它。
我有一个自定义 class 带有变量名称和说明的药物。我把它放在一个数组中,在显示 Medication.name 和 Medication.directions.
的表视图中显示我希望用户能够单击行或附件按钮(详细信息?)以编辑所选行中的值。
我的理想情况是一个菜单,它从选定行的底部下拉,带有可编辑的字段,可以更新数组中的行并重新加载表视图。
有没有办法完成这个或类似的事情?我正在玩弄隐藏的视图字段并让它们在选择行时显示,但我不确定我是否可以将一个锚定到所选行的底部?或者我可以构建一个自定义单元格,在每个单元格中隐藏可编辑字段,单元格具有固定高度,单击它时会发生变化以显示额外字段。
同样,如果最好的选择是使用辅助视图,那么Detail是否最合适?我似乎无法为此右键单击并拖动 segue。或者我会在下面使用这个吗?
optional func tableView(_ tableView: UITableView,
accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath)
如果我将其转移到另一个视图控制器,显然我需要使用委托来更改表视图中的数组,因此我希望找到一个更简单的解决方案。
谢谢!感谢这位新手的任何提示
这是我遇到问题的地方:
let vc = segue.destinationViewController as! MedDetailViewController
vc.delegate = self
let MedRow = self.tableView.indexPathForSelectedRow()!
let passMed = myMedsList[MedRow] //this row doesn't work
vc.detailMed = passMed
segue 不仅是完成此操作的最简单方法,您还可以利用 unwind segue 自动 return 您编辑的值。
不需要委派。没有用于将隐藏视图添加到您的单元格的自定义代码。
如果您只有一个 segue,请将其添加到该行,而不是附件。用户倾向于期望点击该行会有所作为。如果它什么也没做,大多数用户就不会尝试点击配件。
点击配件是一种辅助动作,与点击行不同。
我会在 Storyboard 中设置 show
segue。编写的代码更少,维护的代码更少。让 Storyboard 为您完成工作。
更新:
这是 Apple 关于 Using Unwind Segues 的技术说明,以及目标(呈现)视图控制器如何从源(呈现)视图控制器访问数据的 Swift 示例。
@IBAction func unwindToMainMenu(sender: UIStoryboardSegue)
{
let sourceViewController = sender.sourceViewController as! MedDetailViewController
// Update the medsList array with the new detailMed
let medRow = self.tableView.indexPathForSelectedRow().row
medsList[medRow] = sourceViewController.detailMed
}
更新二:
您想在展开 segue 之前更新详细视图控制器的 detailMed 属性,使用 prepareForSegue: 方法。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "unwindToMedications"
{
// Update the detailMed if the user has edited it
self.detailMed = ... // the edited medication you're returning
}
}
更新 3:
后退按钮(或向后轻扫)只是将推送的视图控制器从堆栈中弹出,但没有被调用的 segue。您需要明确地从完成按钮连接一个 segue,这将为您放松并更新药物列表。
显式展开的原因是为了区分用户是要提交还是取消任何更改。 (他们是否做了更改,但他们想忽略它,所以他们按了返回?)
您有两个选项,两者都可以使用,这取决于您要如何呈现可编辑的详细信息。 (我更喜欢用 push 来显示细节,用 modal 来编辑表单,但是这两种方法都可以)。
推送详细视图控制器。有一个完成按钮。用户可以使用“后退”按钮取消,或使用“完成”按钮接受任何更改的医疗详细信息。
显示带有取消和完成按钮的模态视图控制器。同样,用户可以取消(return 没有更改),或点击完成以(return 和)接受更改。
对于任一演示文稿,您都将展开转场连接到“完成”按钮。这将做的是调用 Meds 列表视图控制器展开操作。在该展开代码中,您可以获取药物详细信息并更新药物列表,正如我们之前讨论的那样。
关于核心数据的提及:
有一种替代方法并不比 segues 更容易学习,但它非常适合。 (要记住的事情,如果不是这个应用程序,那么下一个。)
核心数据和 NSFetchedResultsController
。您保存编辑后的药物,NSFetchedResultsControllerDelegate
为您更新药物列表。
有些人可能会说这太过分了,但自从我开始使用 NSFetchedResultsController 以来,我希望我早点学会它。