2012-03-05 12 views
1

私は自分のモバイルアプリケーションクラスで課題を与えられました:iphone用のカラーゲームアプリを作成してください)以下の貼り付けられたviewcontroller.hファイルの最上部にあります。ストーリーボードとUITableViewデータソースとの混乱:セルにテキストを表示する方法

私はObjective-CとCocoaの新機能ですが、このアプリケーションで多くの問題のトラブルシューティングと修正を行っています。私が今いる問題は、UITableViewCellsを適切に初期化してビューに送信する方法がわからないことです。オンラインで見つかったチュートリアルのすべてでは、UITableViewとセルの異なる属性を変更するためにデータソースメソッドを使用するので、私は混乱しています。私はこれらのメソッドが私がすでに配置したコントロールとどのように相互作用するのかよく分かりません。ストーリーボードファイルで追加したため、データソースコードでtableview属性を定義するのではなく、混乱しています。

私の直接の問題は、自分のプログラムがセルtextlabelとdetailtextlabelに適切なテキストを表示しないことです。

私はUITableViewとUITableViewCellのチュートリアルをオンラインで見てきましたが、何年も前からあり、ストーリーボードの出現によって私がこれらのコントロールを扱う方法が変わったかどうかはわかりません。

私が書いたすべてのコードは、viewcontroller.mまたはviewcontroller.hファイルにあります。セルおよび表示テキストと詳細テキストを呼び出す必要がありViewController.mファイル内

方法:

:私はviewcontroller.mファイルの一番下に呼ばき

-(IBAction)enterClicked 
{ 
//On enter- send instance colors to the colorTable row[i], perform comparisons and append  the resulting symbols to the instanceResults String. Send instanceResults string to the resultTable  row[i]. When game counter reaches 6, gameOver. If on comparisons check, the instanceColors are  the same as the gameColors, then the player wins. 

    [self checkForLoss]; 

    if(!self.gameOver) 
    { 
    resultOfGuess = [self comparePlayerInputToGameColors:guessColors]; 

    [listOfGuesses addObject:guessColors]; 
    [listOfOutcomes addObject:resultOfGuess]; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_numberOfTurnsPlayed inSection:0];  

     UITableViewCell *thisCell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; 

     thisCell.textLabel.text = [self.listOfGuesses lastObject]; 
     thisCell.detailTextLabel.text = [self.listOfOutcomes lastObject]; 

    [guessColors setString:@""]; 

    if([self checkForWin:resultOfGuess]) 
     [UpdateLabel setText:@"You have won!"]; 
    else 
     [UpdateLabel setText:@""]; 

    self.colorCounter = 0; 
    self.isStepOne = YES; 
    _numberOfTurnsPlayed++; 
    } 

    else 
    { 
     if([self checkForLoss]) 
     [UpdateLabel setText:@"You have lost!"]; 
    } 
} 

のUITableViewのデータソースメソッド

#pragma mark - UITableViewDataSource protocol 


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    if(section == 0) 
     return @"Guesses: Results:"; 
    return 0; 
} 

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 6; 
} 

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1  reuseIdentifier:CellIdentifier]; 
    } 
    return cell; 
} 

私の質問は次のとおりです。ストーリーボードでコントロールを作成した場合、データソースメソッドでコントロールのプロパティを変更できますか? uitableviewのセルにテキストを正しく表示するにはどうすればよいですか?

編集/更新:ありがとうございます、私はあなたのアドバイスjrturtonを使用しましたが、今は私の問題の原因かもしれない特異なものを発見しました。私はViewControllerをファイル内を呼び出し、データソースのメソッドが同じメソッドとプロパティを呼び出すことができるように持っていることを考えるのUITableViewController

:のViewControllerへのUIViewController:私のviewController.hファイルに私が

のViewControllerから私のヘッダーを変更しました他のUITableViewチュートリアルファイルでもこれが行われています。キャッチされない例外により「NSInternalInconsistencyException」、理由に

アプリを終了:と私はコンパイルしようと、私はこのエラーを取得する - のUITableViewController:「

問題は、私はViewControllerををread--するヘッダーを変更したときということです - [UITableViewController loadView]は "2-view-3"ペン先をロードしましたが、UITableViewを取得しませんでした。 私はちょうど:ヘッダファイルでUIViewControllerを使ってもうまくコンパイルされます。

アイデア?

更なる更新:私のストーリーボードでは、使用可能なViewControllerオブジェクトはUIViewControllerオブジェクトであることに気付きましたが、他のチュートリアルファイルではこのViewControllerオブジェクトはUITableViewControllerオブジェクトです。これは私の問題だと思いますが、UIViewControllerオブジェクトをUITableViewControllerに切り替えることができません。私ができることは、私が望むものではない新しいものを作り出すことです。私は想像しています。

答えて

1

あなたのアクションメソッドは、データモデルを更新する必要があります(これは、あなたのlistOfGuesses配列を変更するためです)。次に、テーブルビューに、行を追加または更新して、それらを再ロードできるようにする必要があることを確認する必要があります。データまたは特定の行を再ロードするためのUITableViewドキュメントを確認します。

データソースメソッド以外のセルを作成しても、そのセルはテーブルに表示されません。

テーブルビューに空のセルが6つあると思いますか? cellForRowAtIndexPathメソッドでテキストと詳細のラベルを設定する必要があります。今の違いはストーリーボードがあることですは、ストーリーボードプロトタイプのセルで再使用識別子を設定している限り、if(セル== nil)ビットを実行する必要があります。君は。だからあなたのcellForRowAtIndexPathメソッドをに減らすことができます:上記の方法で

  • 」indexPath.row`はあなたを与えるだろう(これは私は完全なサンプルを与えていないよ宿題です)

    -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
    {  
        // This will dequeue or create a new cell based on the prototype in your storyboard  
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    
        // Put your actual configuration here based on your model array 
        cell.textLabel.text = @"Hello";  
    
        return cell; 
    } 
    

    さらなるヒントセルが参照するモデル配列のインデックス

  • テーブルを6行として定義しましたが、モデル配列に項目を追加しています。テーブルが行5を要求し、モデルには3つのエントリ、これに対処する必要があります。表の行数を動的に変更し、表の表示方法を使用して新しい行が追加されたことを示してください。ここでも、UITableViewのドキュメントを参照してください。
1

通常テキストのsetTextプロパティにアクセスすることにより、各セルに設定されている:

[[cell textLabel] setText:@"static string"]; 

又は

[[cell textLabel] setText:someNSString]; 

または.DOT表記と

cell.textLabel.text = someNSString; 

return cell; 

BTWこれはで行われますメソッド:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath: 
関連する問題