web-dev-qa-db-ja.com

UIViewControllerに埋め込まれたUITableViewで静的セルを視覚的に作成および使用する方法

XCode 4.2を使用しており、ストーリーボードを使用してUIを構築しました。 UITableViewの上下にコンテンツを持つビューを作成する必要があり、UIViewControllerを使用してこれを実現できます。 UITableViewControllerでは、テーブルの上または下にコンテンツを追加できません。テーブルのヘッダー/フッターを使用できますが、それは私が達成したいものには機能しません。

UITableViewが埋め込まれたUIViewControllerができました。 UITableViewの高さと幅を適宜調整して、探しているUIレイアウトを提供できます。

UITableViewの静的セルをカスタマイズできますが、ビルドしようとすると次のエラーが表示されます。

無効な構成:静的テーブルビューは、UITableViewControllerインスタンスに埋め込まれている場合にのみ有効です

私の質問は、他の人がどのようにこれを回避しているのですか?静的セルを使用してテーブルビューを作成し、視覚的にレイアウトすることは非常に素晴らしいことですが、どうやら理解できない何らかの理由で許可されていないようです。視覚的なレイアウト要件のため、UITableViewControllerに切り替えることができません。

どんな援助も大歓迎です。

53
StinkyDuck

あなたが正しいです。ストーリーボードでは、viewControllerに埋め込まれた静的セルを持つtableViewを使用できません。それを回避する方法の1つ(ただし、自分で試していないため、動作するかどうかはわかりません)は、静的セルを使用してストーリーボードでUITableViewControllerのインスタンスを作成することです。 UIViewのインスタンスをviewControllerに追加し、UITableViewControllerのtableViewをプログラムでviewControllerのUIViewにロードします。

5
Canopus

Xcode 4.5以降のバージョンでこれを実現するには、アプリがiOS 6以降をターゲットにしていると仮定します。

ストーリーボードで、メインビュー内にビューコンテナーを含むUIViewControllerを作成するだけです。次に、そのビューコンテナを、静的セルを含むUITableViewControllerに接続します。

ちょうどこのような:

enter image description here

1行のコードは必要ありません。クリック、ドラッグ、埋め込みを選択するだけです。 View Controllerの封じ込めは自動的に処理されます。

134
Pedro Mancheno

pmdの答えは機能しますが、iOS 5との後方互換性も必要な場合は、View Containment APIを使用してプログラムで埋め込むことができます。

親UIViewControllerのviewDidLoadメソッドで:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MyTableViewController* vc =[storyboard instantiateViewControllerWithIdentifier:@"MyTableVC"];
    [self addChildViewController:vc];
    [self.view addSubview:vc.view];

    // ensure embedded view is aligned to top
    CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    vc.view.frame = frame;

    [vc didMoveToParentViewController:self]; 
}

静的セルを使用してUITableViewControllerのストーリーボードIDを指定することを忘れないでください。

5
Ken Toh

私はこれが古い質問であることを知っていますが、私はこの問題に対する解決策があります。

UIViewControllerに3つの静的セルが必要だったので、これが私がしたことです。

  1. いくつかのテーブルビューセルを(UITableViewではなく)インターフェイスにドラッグします-テキストなど必要なものを追加します。
  2. セルのIBOutletプロパティを作成して合成します。
  3. ボタンをドラッグして、セル全体を覆うようにします。ボタンを設定して「Custom」と入力し、表示されないようにします-すべてのセルについて繰り返します
  4. ボタンに数値タグを追加します
  5. 以下の機能を実装します。 buttonDownは、ボタンの「タッチダウン」イベントに接続されています。 buttonUpは「Touch Up Inside」に接続されています[〜#〜] and [〜#〜] 'Touch Up Outside'

    -(IBAction)buttonDown:(id)sender {
        if ([sender tag] ==  1) {
            myFirstCell.selected = YES;
        }
        else if ([sender tag] ==  2) {
            mySecondCell.selected = YES;
        }
        else if ([sender tag] ==  3) {
            myThirdCell.selected = YES;
        }
    }
    
    -(IBAction)buttonUp:(id)sender {
        myFirstCell.selected = NO;
        mySecondCell.selected = NO;
        myThirdCell.selected = NO;
    }
    

ButtonDownイベントで好きなことを行い、ボタンを使用して新しいビューに直接移動できます。これは非常に便利です。

3
Patrick