2016-07-23 5 views
0

からのUIViewControllerのFUNCを呼び出すと、私の問題です。 MainTableViewControllerには、BlackViewというUIView用のコンセントもあります。スウィフトはここでカスタムUITableViewCellの

私がしたいこと:myCustomCellの中で "BlackView.hidden = false"を設定したいと思います。私のMainTableViewControllerファイルで "class func"を使ってmyCustomCellから呼び出そうとしていますが、 "func"の前に "class"を置くとXcodeがBlackViewを認識しなくなるため動作しません。

したがって、MainTableViewControllerの関数を呼び出すか、自分の.xibファイルの.swiftからコンセントにアクセスしたいと思います。

誰かがそれを行う方法を知っていますか?

ここに私の.xibファイルされる:

My .xib file

ここでは私の.xibファイルの.swiftである:ここで

class myCustomCell: UITableViewCell { 

    @IBOutlet weak var commentTextView: UITextView! 


    override func awakeFromNib() { 

     commentTextView.delegate = self 

     super.awakeFromNib() 

    } 


    func textViewDidBeginEditing(textView: UITextView) { 

     MainTableViewController.hideBlackView(true) 

    } 

    func textViewDidEndEditing(textView: UITextView) { 

     var comment = commentTextView.text 

    } 

} 

は私MainTableViewControllerです:

class MainTableViewController: UIViewController 

    @IBOutlet weak var MyTable: UITableView! 

    @IBOutlet weak var BlackView: UIView! 

    override func viewDidLoad() { 

     BlackView.hidden = true; 

     MyTable.registerNib(UINib(nibName: "myCustomCell", bundle: nil), forCellReuseIdentifier: "myCustomCellID") 

    } 

    class func hideBlackView(setToHidden: Bool) { 

     if setToHidden == true { 

      BlackView.hidden = true 

     } else { 

      BlackView.hidden = false 

     } 


    } 


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 


      let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCellID") as! PublishHeaderTableViewCell 

      cell.selectionStyle = UITableViewCellSelectionStyle.None 


      return cell 


    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return 1 

    } 

} 

ここに私のメインのストーリーボードがあります:

My Main.storyboard

答えて

3

回答委任

あるBlackViewはOSによって作成されるインスタンスです。コンセントは、そのインスタンスを参照する特別なプロパティ(コンセントと呼ばれます)です。 MainTableViewControllerが表示されると、そのインスタンスがOSによって作成されます。

BlackViewのインスタンスで隠しプロパティを変更するには、クラスメソッドではなく、インスタンスメソッドを使用します。これを行うには、MainTableViewControllerインスタンスのリファレンスをmyCustomCellに渡す必要があります。これは代表団と呼ばれ、iOSプログラミングとほとんどのMVCモデルの動作方法です。

// use a class protocol for delegates so weak properties can be used 
    protocol MyCustomCellDelegate: class { 
     func hideBlackView(setToHidden: Bool) 
    } 

    class MyCustomCell: UITableViewCell { 

      weak var delegate: MyCustomCellDelegate? 
      @IBOutlet weak var commentTextView: UITextView! 

      override func awakeFromNib() { 

       commentTextView.delegate = self 

       super.awakeFromNib() 
      } 


      func textViewDidBeginEditing(textView: UITextView) { 

       delegate?.hideBlackView(true) 
      } 

      func textViewDidEndEditing(textView: UITextView) { 

       var comment = commentTextView.text 
      } 
    } 

次に、あなたが設定しているとき:これはデリゲートプロトコルを定義する追加(カスタムセルの定義は正常になりますすぐ上)と、このタイプのセルに弱いVARを追加行うに

cellForRowAtIndexPathのセルは、適切なセルタイプとしてキャストされます。これは、PublishHeaderTableViewCellを指定した例ではMyCustomCellでなければなりません(また、カスタムセルクラス名をiosの業界標準のように大文字で始めるように変更しました開発)。最後に、デリゲートをMainTableViewController(インスタンス関数内から "self"と呼ばれます)のインスタンスに設定します。

今の場合、1つのセルしか使用していないため、セルをデキューして再利用する必要はありません。そのすべてを取り出し、cellForRowAtIndexPathメソッドでセルの作成した単純なインスタンスを返すことができます。とにかく、スタックオーバーフローのコードを単純化した場合に備えて、すべてのものを残しておきます。

最後に
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

      // you need to cast the cell to your custom class to use it 
      let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCellID") as! MyCustomCell 

      cell.selectionStyle = UITableViewCellSelectionStyle.None 

      // set the delegate 
      cell.delegate = self 

      return cell 
    } 

、非常に重要なのは、MainTableViewControllerは、他のオブジェクトがそれに委譲したいとの関数(メソッド)が成功しますようにそれを使用するプロトコルに準拠していることを宣言する必要があります。あなたのケースでは、上記のMyCustomCellDelegateの両方に準拠する必要がありますが、tableViewのデータソース(cellForRowAtIndexPathおよびnumberOfRowsInSectionの場合)のためにそれを使用しているので、UITableViewDataSourceに準拠していることを宣言する必要があります既にインターフェイスビルダー(ストーリーボード)を介して。あなたがクラス定義でそれを行うことができない場合)。最後の注意として

// Declare objects conform to protocols by including protocol names separated by commas after the colon (or the class inherited from) 
    class MainTableViewController: UIViewController, MyCustomCellDelegate, UITableViewDataSource { 

      @IBOutlet weak var MyTable: UITableView! 
      @IBOutlet weak var BlackView: UIView! 

      override func viewDidLoad() { 
       BlackView.hidden = true 
       MyTable.registerNib(UINib(nibName: "myCustomCell", bundle: nil), forCellReuseIdentifier: "myCustomCellID") 
      } 

     func hideBlackView(setToHidden: Bool) { 
        // since they are both bools just set BlackView.hidden to the setToHidden parameter directly 
        BlackView.hidden = setToHidden 
      } 


      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

        let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCellID") as! MyCustomCell 
        cell.selectionStyle = UITableViewCellSelectionStyle.None 

        // set the delegate 
        cell.delegate = self 

        return cell 
      } 

      func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
       return 1 
      } 
    } 

、私はわからないUITextViewのためのデリゲートを設定しているカスタムセルでawakeFromNib方法で適切です。私はこの方法が常に発火するとは限らないことを知っています。あなたのケースではコンセントにあるので、それは問題ないと思いますが、私はXIBファイルを自分のものと大いに使っていないので、それが毎回呼び出されていることを確認したり、問題をより深く研究したりしてください。

+0

ありがとうございました!それは今、動作します!私はちょうどあなたのコードで次の変更を加えなければなりません:1:弱いvarの代理人から "弱い"を削除:MyCustomCellDelegate? 2: "class func hideBlackView(setToHidden:Bool)"から "class"を削除します。 –

+0

「クラス」を削除する必要性が気に入っています。それはコピー貼りの誤字です。上記のコードはいずれもXCodeで書かれていませんでした。したがって、他のエラーがある可能性があります。私はバグを削除するコードを更新しました。弱い委任先:MyCustomDelgate?から弱点を削除する必要はありません。実際には、 "弱い"ことをしないことは悪い習慣です。それはそれを所有するオブジェクトへの強い参照を保持するからです。これにより、iosのシーンの背後にあるメモリ管理を扱う自動参照カウントが機能しなくなります。 –

+0

あなたのケースでは、UITableViewによって保持されているものへの参照が破棄されたとき(テーブルが有効範囲外になったとき)にセルが破棄されることを付け加えておきます。 UIViewControllerインスタンスがスコープ外に出る前に、これはほぼ確実に起こります。この場合、恐れがある「保持サイクル」は発生しません。上記のコードでクラスプロトコルとして宣言するのを忘れてしまったので、弱くすることはできませんでした。 –

関連する問題