2012-06-14 13 views
28

私は私のプロジェクトでは、既存のViewController + XIBを持って、そして今私はこのように、静的な細胞とのUITableViewを追加したい:ストーリーボードを使用せずにスタティックセルをUITableViewで使用する方法は?

TableView with static cells

しかし、私は私の画面上にのUITableViewをドラッグすると、私にはありませんAttributes Inspectorに「Content> Static」メニューがあります。

私のコントローラーのサブタイトルUITableViewControllerを作成しようとしましたが、それでも問題ありません。属性検査で静的セルを使用するオプションはまだありません。

私はStackOverflowを見回しましたが、この質問に対する既存の回答は見つかりませんでした。すべての既存の質問は、xibファイルの代わりにストーリーボード(私が使用していない)に関連しています。

私が推測することは、UITableViewControllerをストーリーボードに追加するときにXcodeが何らかのマジックを行うが、既存のxibをUITableViewControllerから継承するように変更したときではないということだ。

スタティックセルを含むテーブルビューを既存のxibに追加する方法を教えてください。

答えて

43

スタティックテーブルビューのセルは、ストーリーボードを使用する場合にのみ使用できます。ただし、UI全体でストーリーボードを使用していない場合でも、スクリーンのコレクションではなく個々の画面でストーリーボードを使用できます。

これを行うには、カスタムView ControllerサブクラスにFile's Ownerが設定されている単一のView Controllerを持つUIStoryboardファイルを作成できます。 VCの識別子をある値に設定します。これを表示するには、ストーリーボードを取得し、ストーリーボードからVCを作成してView Controllerサブクラスをインスタンス化します。

UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil]; 
CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"]; 

いつものようにこのVCをあなたのアプリケーションに表示することができます。

これは、アプリ全体を変換して使用することなく、ストーリーボードの使用を開始するのに最適な方法です。

+5

この場合のパフォーマンスはどうですか? – mariusLAN

+1

ios 4.3以前のストーリーボードを作成できません:( – tesmojones

22

これは絵コンテなしでなんとかです:

  1. コントローラがテーブルビューのデリゲートと ソースのためのプロトコルを採用しなければならない... UITableViewDelegate、UITableViewDataSource
  2. があなたの.xibにテーブルビューを追加します。テーブルビューのスタイルを「グループ化」に設定する
  3. テーブルをコントローラのプロパティに接続する(「yourTableView」と呼ぶ)
  4. テーブルビューのセルを別々のビューとして.xibに追加します。 がテーブルビューのサブビューとして... .xibに自由に浮動します。 (下の画像例を参照)
  5. テーブルセルにコントロール/ラベルなどを追加します。
  6. 各テーブルビューセルの属性の[識別子]フィールドに一意の文字列を割り当てます。
  7. コントローラにIBAction-EDの方法細胞のコントロールの送信イベントを接続
  8. (sliderCell、switchCellなど)コントローラ内の他のプロパティにテーブルのセルを接続 - (IBAction)handleSliderCell、等あなたのコントローラのviewDidLoadメソッドで
  9. 、(self.yourTableControl.delegate =自己; self.yourTableControl.dataSource =自己;)コントローラへのデリゲートとテーブルビューのソースを割り当てる
  10. が実装numberOfSectionsInTableView、numberOfRowsInSection、及びtableViewのコントローラ
  11. でcellForRowAtIndexPath:cellForRowAtIndexPathは、適切なindexPathためyourFirstCell、yourSecondCell、などのポインタを返す:,は、テーブルセルのコントロールのための

イベント

...あなたのハンドラルーチンに行くべき値ステップ4のための

例: xib

+1

ストーリーボードがサポートされているiOSバージョンをターゲットにしている場合は、この方法の利点はありますか? – philwilks

+0

私にはうまくいかないバンドル**エラーIBで作成されたセルに関連付けられたクラスがないので、明示的にnibを登録することはできないので、 'UITableViewCell'のサブクラスを作成してセルに追加し、 – Isuru

+1

@philwilks - このストーリーボードの利点は、ストーリーボードを使わないことから設定管理のメリットが得られることです。そのため、複数の開発者がUIを更新している場合は、このような混乱を避けてください。 –

0

それは数10になると、ここで、BVBの答えに展開するには、あなたのテーブルビューのデリゲートメソッドについてスウィフト3スニペットがあります。 xibのすべてのセルにアウトレットを追加してください。

テーブルビューセクションを手動で作成するときは、indexPathがテーブル構造を表す2次元配列に等しいことに注意してください。たとえば、indexPathtableView(cellForRowAt indexPath: IndexPath)に渡された場合、[1][0]に等しい場合、セルは2番目のセクションの最初の位置に配置されます。

indexPath.rowindexPath.sectionの値を使用して値をindexPathから引き出すことができます。これらの値を使用して、IBOutletsからセクションを手動で構成することができます。

@IBOutlet var is_enabled: UITableViewCell! 
@IBOutlet var is_public: UITableViewCell! 

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    switch(section){ 
     case 0: 
      return "Cell 1" 
     case 1: 
      return "Cell 2" 
     default: return "" 

    } 
} 

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

func numberOfSections(in tableView: UITableView) -> Int { 
    return 2 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    print("index path here", indexPath) 
    if(indexPath.section == 0) { 
     return is_enabled 
    } 
    else if(indexPath.section == 1) { 
     return is_public 
    } else { 
     return is_enabled 
    } 
} 
関連する問題