Вопрос по ios, foursquare, uitableview – Создание сгруппированного UITableview с различными типами ячеек

3

Мне нужно создать сгруппированный uitableview, который включает в себя несколько разделов и, возможно, разные типы ячеек в каждом разделе.

Я пытаюсь создать что-то похожее на старое приложение Foursquare, пользовательскую страницу (включает в себя «списки лидеров», «предложения друзей», «друзья», «статистика», «наиболее изученные категории»).

Я довольно новичок в программировании на ios, так что это представление не может быть сгруппированным.

Что мне особенно понравилось, так это создание разных ячеек для разделов и выяснение, по каким ячейкам щелкают.

Мой источник данных будет 2 разных NSArray *, который состоит из разных типов данных, поэтому мне нужны разные пользовательские ячейки.

Ваш Ответ

2   ответа
5

l, и вTableview: cellForRowAtIndexPath: Метод для вашего UITableViewDataSource, вы можете использовать операторы 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!
   }
}
Большое спасибо @RileyE. Последний вопрос, если это не слишком много. Как я могу установить источник данных TableView с двумя разными NSArray? tackleberry
Да. Так лучше. Вы получите indexPath в методе didSelectRow, а затем вам просто нужно будет выполнить проверку того же типа, что и ранее для массивов, чтобы выяснить, какой это тип.
Спасибо за ответ. Хорошо, это имеет смысл, но как я могу получить элемент в этом методе, у меня есть 2 разных массива, но этот метод дает только индекс? и как я могу реализовать методы numberOfRowsInSection и didSelectRowAtIndexPath вашим методом? tackleberry
@RileyE да, я думаю, ты прав. Как я уже сказал в своем комментарии, это может решить проблему размещения ячеек разных типов, но я до сих пор не представляю, как я могу понять, какая ячейка нажимается, и как я могу передать данные в действие щелчка. Надеюсь теперь понятно? tackleberry
Я не думаю, что вы прояснили свой вопрос. Что именно вы пытаетесь сделать и что не так с этим ответом? Это именно то, что вам нужно сделать, чтобы создать разные типы клеток.
6

и вам нужно отображать оба в разных разделах, вам нужно разделить методы источника данных на два.

В основном, выберите, какой набор данных вы хотите быть первым и вперед.

- (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;
Не стесняйтесь спрашивать меня об этом.
спасибо @ipwnstuff, помог мне понять, что такое раздел / счет. tackleberry
Это работает лучше? Я пытаюсь объяснить, а не измениться.
спасибо @RileyE. Теперь это совершенно ясно, за исключением установки заголовков для каждого раздела. Можете ли вы добавить эту информацию тоже в свой ответ, пожалуйста, если вы знаете об этом? tackleberry
Я думаю, что вы должны уточнить, что indexPath.section и section, если операторы должны сравниваться с 0 и 1. Да, и сделайте & quot;if(section)return secondArray.count; return firstArray.count;& Quot;if(section = 0){return firstArray.count} else{return secondArray.count}

Похожие вопросы