3

いくつかのセクションと、場合によっては各セクションに異なるセル タイプを含む、グループ化された uitableview を作成する必要があります。

古いフォースクエア アプリ、ユーザー ページ (「リーダーボード」、「友達の提案」、「友達」、「統計」、「最も探索されたカテゴリ」などのセクションを含む) のようなものを作成しようとしています。

私はiosプログラミングにかなり慣れていないので、そのビューはグループ化されたuitableviewではないかもしれません。

私が特にこだわったのは、セクションごとに異なるセルを作成し、どのセルがクリックされたかを調べることです。

私のデータ ソースは、異なるデータ型で構成される 2 つの異なる NSArray* になるため、異なるカスタム セルが必要です。

4

2 に答える 2

6

2 つの異なるデータ セットがあり、両方を異なるセクションに表示する必要があるため、データ ソース メソッドを 2 つに分割する必要があります。

基本的に、最初に作成するデータセットを選択してから作業を開始します。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(section)return secondArray.count;
    //Essentially, if statements evaluate TRUE and move forward if the inside is 1 or greater (TRUE == 1)
    return firstArray.count;
    //If the first if statement return hits, then the code will never reach this statement which turns this into a lighter if else statement
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.section)
    {
        //do stuff with second array and choose cell type x
    }
    else
    {
        //do stuff with first array and choose cell type y
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Get the cell with: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(indexPath.section)
    {
        //perform action for second dataset
    }
    else
    {
        //perform action for first dataset
    }
}

ヘッダーの場合、これらの方法のいずれかを使用して、上記と同じタイプのスタイルを維持できます。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
于 2012-06-25T21:42:57.290 に答える
5

UITableViewCellの複数のカスタムサブクラスを作成できます。また、UITableViewDataSourceのtableView:cellForRowAtIndexPath:メソッドで、ifステートメントを使用して使用するセルのタイプを決定できます。

たとえば、これが私がするかもしれないことの大まかな概要です:

-(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //First, determine what type of object we're showing
    if (indexPath.section == 0) {
         //Create and return this cell.
    } else if (indexPath.section == 1) {
         //Create and return this cell.
    }...
}

実装方法は次のnumberOfRowsInSectionとおりです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

   if (section == 0) {
      return [firstSectionArray count];
   } else if (section == 1) {
      return [secondSectionArray count];
   } ...
}

にとってdidSelectRowAtIndexPath

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   if (indexPath.section == 0) {
      ObjectSelected *objectSelected = [firstArray objectAtIndex:indexPath.row];

      //Now you've got the object, so push a view controller:
      DetailViewController *dvc = [[DetailViewController alloc] init];
      dvc.objectSelected = objectSelected;
      [self.navigationController pushViewController:dvc];
   } else if (indexPath.section == 1) {
      //Same thing, just call [secondArray objectAtIndex:indexPath.row] instead!
   }
}
于 2012-06-25T20:29:12.923 に答える