2017-04-13 10 views
-1

セグメント化されたコントロール内の別の項目が選択されるたびにビューコントローラと通信するカスタムクラスのセグメント化コントロールがあります。 View Controllerにデータを渡すことができます。関数が呼び出されたときに、関数の項目がnilになるSwift 3

@IBDesignable class SegmentedControlLeft: UIControl { 

    var selectedIndex: Int = 0 { 
     didSet { 
      displayNewSelectedIndex() 
      let storyboard = UIStoryboard(name: "Main", bundle: nil) 
      let messagesViewController: MessagesViewController = storyboard.instantiateViewController(withIdentifier: "PurpleVC") as! MessagesViewController 
      messagesViewController.animateViews(selectedIndex: selectedIndex) 
     } 
    } 
...some more code 
} 

ただし、渡された変数が更新されるたびに基本的なロジックを使用しようとすると、「animateViews」関数内のすべての項目が明らかにnilになります。私は悪名高い "予期せぬ発見なし"のエラーを受け取ります。これは、私が渡している変数を使用しようとする場合にのみ発生します。

import UIKit 

class MessagesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 

@IBOutlet weak var messageTableView: UITableView! 
@IBOutlet weak var boostCollectionView: UICollectionView! 

     override func viewDidLoad() { 
       super.viewDidLoad() 
      ...all cells, delegates, and datasource are registered and setup in here. 
     } 

     func animateViews(selectedIndex: Int) { 

       if selectedIndex == 0 { 
        print("LEFT") // prints as expected 
        self.messagesTableView.isHidden = false // unexpected found nil error on each of these items. 
        self.boostCollectionView.isHidden = true 
       } else if selectedIndex == 1 { 
        print("RIGHT") // prints correctly when updated 
        self.messageTableView.isHidden = true 
        self.boostCollectionView.isHidden = false 
       } 
      } 
} 

私はあまりにも長い間、これで遊んでてきた、はどのように私はanimateViewsのビューは、私がセグメント化されたコントロールから渡している変数を使用して非表示と再表示するために機能するのですか?

私はここにはいないと思われる驚くほど簡単な修正がありますが、これまでの視線を得ることに感謝します。ありがとうございました!

+0

なぜ誰かがこの質問に投票しませんでしたか? –

答えて

0

messagesViewController.animateViews(selectedIndex: selectedIndex)に電話するときにはMessagesViewControllerがインスタンス化されないため、この問題が発生しています。これは、テーブルビューとコレクションビューがまだ描画されておらず、作成前に使用しようとしていることを意味します。

ビューコントローラのUI要素を使用するには、viewDidLoad()メソッドを一度呼び出す必要があります。

この行がlet messagesViewController: MessagesViewController = storyboard.instantiateViewControlと呼ばれるたびに、ビューコントローラの新しいインスタンスが作成されます。

提案:

私の提案は(あなたがビューコントローラで複数のセグメント化されたコントロールを持っているように思える)セグメント化されたコントロールの出口を作成し、@IBAction func indexChanged(_ sender: AnyObject) {のようなメソッドを作成し、このアクションを割り当てることになりますvalue changedセグメント化されたコントロールのプロパティ。

senderパラメータを使用すると、セグメント化されたコントロールを区別できます。

+1

成功!あなたの説明や提案は素晴らしかったです!すべてが今では完全に機能します。貴重な洞察をいただきありがとうございます! –