gpt4 book ai didi

swift - 从不同的 View Controller 按字母顺序对 TableView 内的单元格进行排序

转载 作者:行者123 更新时间:2023-11-28 06:46:24 26 4
gpt4 key购买 nike

我有两个场景。场景 A 是一个由水果列表组成的表格 View 。场景 B 有一个分段 Controller ,其中一个选项可以按字母顺序对水果进行排序。

场景A:

@IBOutlet weak var tableView: UITableView!


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showFilter" {
_ = segue.destinationViewController as! FilterViewController
}
}

?func alpheticalOrder(sender: AnyObject) {
fruits.sortInPlace({$0.name < $1.name }) } ?

场景B:

func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCellWithIdentifier("FilterCell") as! FilterCell
cell.segmentedController.addTarget(self, action: "segmentedControllerActionChanged:", forControlEvents: .ValueChanged)
return cell

}

@IBAction func segmentedControllerActionChanged(sender: AnyObject) {
if sender.selectedSegmentIndex == 0 {
fruits.sortInPlace({$0.name < $1.name })
}

override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: "close:")
greyView.addGestureRecognizer(tap)
}

func close(tap: UITapGestureRecognizer) {
self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
}

此处是 ViewController().tableView.reloadData() 行不正确,尽管我将其放入以帮助理解我要实现的目标。在退出场景 B 返回场景 A 后,我需要以某种方式重新加载 tableview 数据以按水果名称的字母顺序对单元格进行排序。

最佳答案

考虑代码行:

ViewController().tableView.reloadData()

这不会告诉现有的 ViewController 重新加载。 ViewController() 创建该 View Controller 的一个实例(它没有连接到任何 Storyboard场景;没有数据;将立即被释放),并告诉它重新加载自身。

您需要让 B 引用现有的 A,而不是创建一个新的。此外,您可能不想在 B 中对 fruits 进行排序,而是在 A 中排序。因此:

  • 在 B 中添加一个指向 A 的属性:

    var sourceViewController: ViewControllerA! 
  • 在A的prepareForSegue中,你必须在B中设置这个属性,例如:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showFilter" {
    let filterViewController = segue.destinationViewController as! FilterViewController
    filterViewController.sourceViewController = self
    }
    }
  • 在 A 中实现对数据进行排序并重新加载表的方法:

    func sortFruitsAndReload() {
    fruits.sortInPlace {$0.name < $1.name }
    tableView.reloadData()
    }
  • B 中的 segmentedControllerActionChanged 应该在 A 中调用该方法:

    @IBAction func segmentedControllerActionChanged(sender: AnyObject) {
    if sender.selectedSegmentIndex == 0 {
    sourceViewController.sortFruitsAndReload()
    }
    }

或者,更好的是,使用协议(protocol)使这两个类保持“弱耦合”(即打开在其他情况下使用此过滤器/排序 View Controller 的大门):

  • 在B中添加一个协议(protocol):

    protocol FilterViewDelegate {
    func sortAndReload()
    }
  • 在 B 中添加一个属性以维护对此委托(delegate)的引用:

    var delegate: FilterViewDelegate?
  • 指定 A 将遵守此协议(protocol):

    class ViewControllerA: UIViewController, FilterViewDelegate { ... }

    显然,A 的 View Controller 类和基类的名称保留为您现在使用的任何名称,但只需将 FilterViewDelegate 添加到类声明中即可;

  • 在A中实现方法对数据进行排序并重新加载表以满足符合本协议(protocol)的要求:

    func sortAndReload() {
    fruits.sortInPlace {$0.name < $1.name }
    tableView.reloadData()
    }
  • 在 A 的 prepareForSegue 中,您在 B 中设置此 delegate 属性,例如

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showFilter" {
    let filterViewController = segue.destinationViewController as! FilterViewController
    filterViewController.delegate = self
    }
    }
  • B 中的 segmentedControllerActionChanged 应该在 A 中调用该方法。

    @IBAction func segmentedControllerActionChanged(sender: AnyObject) {
    if sender.selectedSegmentIndex == 0 {
    delegate?.sortAndReload()
    }
    }

关于swift - 从不同的 View Controller 按字母顺序对 TableView 内的单元格进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36223031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com