2017-04-04 1 views
1

私はUITableViewにデータをロードするためにレルムを使用していますが、UISegmentedControlをナビゲーションのタイトルとして設定しました。しかし、segmentedControlChangedがトリガされると、私のtableViewの何も変化しません。segmentedControlChangedでUITableViewが変更されない

var productViewSegmentedControl: UISegmentedControl? = nil 
let realm = try! Realm() 
var allProducts : Results<Product>? 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    if allProducts == nil { 
     allProducts = realm.objects(Product.self).sorted(byKeyPath: "basedescription") 
    } 

    if productViewSegmentedControl == nil { 
     let segmentedControlItems = ["List", "Brands", "Categories"] 
     productViewSegmentedControl = UISegmentedControl(items: segmentedControlItems) 
     productViewSegmentedControl?.selectedSegmentIndex = 0 

     self.navigationItem.titleView = productViewSegmentedControl 
     productViewSegmentedControl?.addTarget(self, action: #selector(OrderFormViewController.segmentedControlChanged(_:)), for:.allEvents) 
    } 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

} 

func segmentedControlChanged(_ segControl: UISegmentedControl){ 

    switch segControl.selectedSegmentIndex{ 
     case 0: 
      _ = allProducts?.sorted(byKeyPath: "basedescription") 
      tableView.reloadData() 

     case 1: 
      _ = allProducts?.sorted(byKeyPath: "itembrand") 
      tableView.reloadData() 

     case 2: 
      _ = allProducts?.sorted(byKeyPath: "itemtype") 
      tableView.reloadData() 

     default: break 

    } 
} 

答えて

2

は、なぜあなたはしますか:何も変わらないので、

_ = allProducts?.sorted(byKeyPath: "basedescription") 

あなたは結果を無視しています。 sortedメソッドは送信者を更新せず、新しいコレクションを返します。

allProductsを更新する必要があります。テーブルビューをリロードするときに変更されるようにする必要があります。

おそらく(これは、レルムでサポートされている場合)欲しい:

allProducts?.sort(byKeyPath: "basedescription") 

か:

allProducts = allProducts?.sorted(byKeyPath: "basedescription") 

そしてもちろん、あなたは同様に他の例を更新する必要があります。

+0

何らかの理由で、アンダースコアを使用して結果を更新すると考えました。私はこのように試してみる。 – Sicypher

+0

いいえ、アンダースコアの使用は、関数呼び出しの戻り値を無視していると不平を言ったときにコンパイラを静かにすることです。 – rmaddy

関連する問題