2017-02-02 8 views
1

私はストーリーボードとテーブルビューを使用しています。私のテーブルビュー内の各セルにはUIViewがあります。このUIViewIBOutletをプログラムで置き換えることはできますか?たとえば、次のようなことをします。IBOutletビューをコードに置き換えてください

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. 

    func configureCell(with customObject: CustomObject) { 

     // Set the IBOutlet in code here. 
     self.videoPlayerView = customObject.videoPlayerView 
    } 
} 

これを行うと何も起こりません。

私は多くの人々が「なぜこれをやりたいのですか?ここに行く:私はこのライブラリVIMVideoPlayerを使用していると私はコード内のUIViewを含む実際のプレーヤーを作成します。プレイヤーを再利用する代わりに、コード内でそれらを一度に作成して、それらを表示したいと思っています。これは、パフォーマンスの理由から、メインスレッドでのスクロールや遅延をなくすことになります。

注:これは既にコードで動作していますが、実際にはストーリーボードを使用したいと思っています。私がコードで作業する方法は、これを行うことです: videoHolderView.addSubview(customObject.videoPlayerView)

どのような考えですか?

+0

要約すると、ビデオ再生のサブビューを追加するとします。自分で追加することもできますが、コードにも制約を追加する必要があります。または、IBで設定されたビューのサブビューとして追加することもできます。他の選択肢はありません。私が知りたいことは、サブビューオプションに何が問題なのかです。質問は「スクロールと遅れ」です。何が問題なのですか?アウトレットのUIViewを放棄すれば、なぜその問題は解消されますか? – danh

答えて

1

のために必要とされるすべての制約を追加する必要がありますが、それはビュー階層を変更することはありません

func configureCell(with customObject: CustomObject) { 

    // Set the IBOutlet in code here. 

    self.videoPlayerView.removeFromSuperview() 

    self.videoPlayerView = customObject.videoPlayerView 

    self.addSubView(self.videoPlayerView) 

} 

注意。 元のビューのスーパービューに新しいビューを挿入し、古いビューを削除する必要があります。 これはレイアウトの制約を保持しないので、置き換えビューを追加した後で再作成する必要があります。

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. 

    func configureCell(with customObject: CustomObject) { 
     // Replace the view by inserting a new view into the same location 
     // in the view hierarchy 
     let newVideoPlayerView = customObject.videoPlayerView 
     videoPlayerView.superview.insertSubview(newVideoPlayerView, belowSubview: videoPlayerView) 
     videoPlayerView.removeFromSuperview() 

     // Set the IBOutlet in code here. 
     videoPlayerView = newVideoPlayerView 

     // TODO: Recreate your layout constraints 
    } 
} 
+0

私は以下の答えから私のコメントをコピー/ペーストしています:これを行う方法はありますか?ストーリーボードの利点は、視差があり、いくつかの制約に依存しているためです。ここではストーリーボードに切り替えると多くのメリットはありません。 – JEL

+0

いいえ、別のビューをラッパーとして使用して制約を単純化することができます。これには、置換する単一の子ビューのみが含まれています。親ビューに単純な上/左/下/右の制約を追加することができます。 – kevin

+0

私は、実際にこれを行う際には何のメリットも見ません。このストーリーボードのアプローチには何か利点があると思いますか?私が現在やっていることは、コードでビューを作成してから、 'videoHolderView.addSubview(customObject.videoPlayerView)'を実行することです。 – JEL

0

これは可能ですが、すべての現在のコードが実行しているのは、プロパティを更新することだけです。ビュー階層から既存のビューを削除し、新しいビューをサブビューとして追加する必要があります。あなたはまた、新しいビュー変数が細かい変更

+0

制約をもう一度削除してから追加しなくても、これを行う方法はありますか?ストーリーボードの利点は、視差があり、いくつかの制約に依存しているためです。ここではストーリーボードに切り替えると多くのメリットはありません。 – JEL

関連する問題