2016-03-25 49 views
1

我有兩個場景。場景A是由水果列表組成的桌面視圖。場景B有一個分段控制器,其中一個選項可按字母順序對水果進行分類。按字母順序從不同的視圖控制器中對單元格內的單元格進行排序

場景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()行是不正確這裏,但我把它放在幫助瞭解我想要的目的。不知怎的,我需要重新加載tableview中的數據退出場景B後,由水果名稱的字母順序排列的細胞恢復到現場A.

+0

你是說SceneA是一個視圖控制器和SceneB另一個視圖控制器? – Antoine

+0

這是正確的 – luke

回答

1

考慮代碼行:

ViewController().tableView.reloadData() 

並沒有告訴現有ViewController到重裝。 ViewController()創建一個新的該視圖控制器的實例(它不連接到任何故事板場景;沒有數據;並且將立即解除分配),並告訴它重新加載自己。

您需要讓B引用現有的A,而不是創建一個新的A。此外,您大概不希望排序B中fruits,而是回到了A.這樣:

var sourceViewController: ViewControllerA! 
    • B中指向回A添加屬性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應該呼叫並在該方法中:

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

    ,或者甚至更好,使用協議,以保持這兩個類 「弱耦合」(即打開門以使用該過濾器/排序在其他情況下視圖控制器):

    • 在乙加上協議:

      protocol FilterViewDelegate { 
          func sortAndReload() 
      } 
      
    • 在乙添加屬性,以保持參考這個delegate

      var delegate: FilterViewDelegate? 
      
    • 指定A將符合本協議:

      class ViewControllerA: UIViewController, FilterViewDelegate { ... } 
      

      很明顯,保持A的視圖控制器類和基類的名稱與你現在使用的任何東西相同,只是將FilterViewDelegate添加到類聲明中;

    • 實現的方法,其對數據進行排序和重新加載表,以滿足符合本協議的要求:在A的prepareForSegue

      func sortAndReload() { 
          fruits.sortInPlace {$0.name < $1.name } 
          tableView.reloadData() 
      } 
      
    • ,設置在乙此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() 
          } 
      } 
      
  • +0

    啊所以我可以做類似func alpheticalOrder(發件人:AnyObject){ fruits.sortInPlace({$ 0.name <$ 1.name}) }在A中,並使用分段控制器在場景B中調用它? – luke

    +0

    對不起,看起來有點凌亂 – luke

    +0

    是的,但不要使用'ViewController()'語法,因爲這不是指現有的A視圖控制器,而是創建(並放棄)另一個空白的。看修改後的答案。 – Rob

    相關問題