【问题标题】:How to reinitialize table view override function?如何重新初始化表格视图覆盖功能?
【发布时间】:2016-02-16 02:06:10
【问题描述】:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let storyboard = UIStoryboard(name: "FilteringPageSelection", bundle: nil)
        controller = storyboard.instantiateViewControllerWithIdentifier("FilteringPageSelectionController") as! FilteringPageSelectionTableViewController
        controller.filteringType = filterTitle[indexPath.row];
        controller.selectedValue = selectedValue;

        controller.title = "Selection"
        self.navigationController?.pushViewController(controller, animated: true)

        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }

上面是我的代码,这是我的表格视图控制器代码,我打算通过单击它的单元格来推送到另一个视图控制器。在新控制器内部,我有多个值可供选择。然而,在我从新控制器中选择新值后,我回到原始表格视图场景并从新控制器中获取选定值并分配给变量 selectedValue。下面是我的 unwind segue 代码。

 @IBAction func unwindToFilteringVC(segue:UIStoryboardSegue) {
    selectedValue = controller.selectedValue
}

但是,当我再次单击单元格时,由于 tableview 覆盖功能仅在 tableview 加载时第一次初始化,所以当我更改 selectedValue 的值时,controller.selectedValue 仍然保持旧值并推送进入新的控制器。

如何更改 controller.selectedValue 的值?

【问题讨论】:

  • 您能否在更高、更多的用户界面级别上解释一下您真正想要实现的目标是什么?
  • 当您调用 unwind segue 时,您需要重新加载所有表视图控制器以更新行中的数据。
  • 在你的 viewWillAppear 方法上放一个 tableview.reloadData()
  • 我已经编辑了问题,如果有任何问题请问我
  • 嗨 CCastro 我已经使用了覆盖 func viewWillAppear(animated: Bool) { super.viewWillAppear(animated); tableView.reloadData() } 不起作用

标签: ios swift


【解决方案1】:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) - 每次点击单元格时都会调用此函数,而不仅仅是一次。因此,每当您选择一个单元格时,您的代码都会实例化过滤视图控制器并将其selectedValue 设置为表视图控制器的当前selectedValue(除非这是一个全局变量)。也许这不是你想要的。

您可能混淆了selectedValue 是哪个。你应该重命名一个。

【讨论】:

  • 我发现我的代码有问题,没有初始化一次,谢谢帮助
【解决方案2】:

我认为您需要使用委托模式来通知表视图控制器选择视图控制器中的选定值,而不是持有对它的引用。首先你定义一个协议:

protocol SelectionViewControllerDelegate: class {
  func selectionViewController(controller: SelectionViewController, didSelectValue value: ValueType)
}

您添加对符合该协议的可选属性的弱引用,并在您在选择视图控制器中处理选择操作的位置通知代理所选值的更改。

class SelectionViewController: UIViewController {
  weak var delegate: SelectionViewControllerDelegate?

  func handleChange() {
    delegate?.selectionViewController(self, didSelectValue: selectedValue)
  }
}

然后你让你的表视图控制器符合这个协议,如下所示:

class TableViewController: UITableViewController, SelectionViewControllerDelegate {

  func selectionViewController(controller: SelectionViewController, didSelectValue value: ValueType) {
    self.selectedValue = value
  }

}

不要忘记在 didSelectRowAtIndexPath 方法中将表视图控制器设置为选择视图控制器的委托:

controller.delegate = self

就在你调用 navigationController?.pushViewController 方法之前。

【讨论】: