2016-03-31 3 views
2

Я хочу заполнить данные в uitableview. У меня разные разделы с разной категорией, и каждая категория содержит различное количество строк.Заполнение таблицы с категорией раздела

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
     return allCategory.count; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSString *heading = [allCategory objectAtIndex:section]; 
    return heading; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    int count = 0; 
    NSString *heading = [allCategory objectAtIndex:section]; 
    for (Product * cat in productArry) { 
     if ([cat.category containsString:heading]) { 

      count ++; 
     } 
    } 

    return count; 

} 

Это код, в котором я возвращаю ряд строк на основе категории. Например, у меня есть название категории «Двигатель», которое возвращает одно число строк и категорий «Блоки», которые возвращают 2 числа строк. Теперь я хочу заполнить данные по каждой категории в методе cellForRowAtIndexPath. Как я могу заполнить правильные данные по каждой категории?

+0

сколько тип категории в массиве? – iOS

+0

В массиве Im может быть X количество категорий. – Devster101

+0

X количество категорий @DarjiJigar – salmancs43

ответ

1

Вариант 1:

- (Product *)dataForRowAtIndexPath:(NSIndexPath *)indexPath { 
    int count = 0; 
    NSString *heading = [self.allCategory objectAtIndex:indexPath.section]; 
    for (Product * product in self.productArry) { 
     if ([product.category containsString:heading]) { 
      if (count == indexPath.row) { 
       return product; 
      } 
      count++; 
     } 
    } 
    return nil; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Product *product = [self dataForRowAtIndexPath:indexPath]; 
    return nil; 
} 

Вариант 2: Или вы можете сделать отфильтрованный массив

.h

@property (nonatomic, strong) NSArray *allCategory; 
@property (nonatomic, strong) NSArray *productArry; 
@property (nonatomic, strong) NSArray *products; 

.m

- (NSArray *)products { 
    if (!_products) { 
     NSMutableArray *arrayCategoryProductArray = [[NSMutableArray alloc]init]; 
     for(int i =0 ;i< self.allCategory.count;i++){ 
      NSString *strCat = [self.allCategory objectAtIndex:i]; 
      NSArray *filteredarray = [self.productArry filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(category == %@)", strCat]]; 
      [arrayCategoryProductArray addObject : filteredarray]; 
     } 
     _products = arrayCategoryProductArray; 
    } 
    return _products; 
} 

Входной

<__NSArrayI 0x7866c8b0>(
<Product: 0x78668460; category = A; name = A1>, 
<Product: 0x78663280; category = B; name = B1>, 
<Product: 0x7866c750; category = A; name = A2>, 
<Product: 0x7864c950; category = B; name = B2>, 
<Product: 0x786610a0; category = B; name = B3> 
) 

Выход

<__NSArrayM 0x798449b0>(
<__NSArrayI 0x79839050>(
<Product: 0x78668460; category = A; name = A1>, 
<Product: 0x7866c750; category = A; name = A2> 
) 
, 
<__NSArrayI 0x798c7310>(
<Product: 0x78663280; category = B; name = B1>, 
<Product: 0x7864c950; category = B; name = B2>, 
<Product: 0x786610a0; category = B; name = B3> 
) 
) 

Так

- (Product *)dataForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Product *product = [[self.products objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    return product; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Product *product = [self dataForRowAtIndexPath:indexPath]; 
    return nil; 
} 
+0

его работало ...... Спасибо @ tim007 – salmancs43

+0

вариант 2 лучше – salmancs43

+0

Лучше перезаписать '- (NSArray *) products', использовать' filterArrayUsingPredicate' в цикле, не очень хорошо для производительности, например. имеют более 100 категорий и запускать 'filterArrayUsingPredicate' в 100 раз. Только цикл productArry один раз для генерации '- (NSArray *) продуктов' лучше. –

1

Сначала вы должны отфильтровать массив по categories..Like ниже ...

NSMutableArray *arrayCategoryProductArray = [[NSMutableArray alloc]init]; 
for(int i =0 ;i< allCategory.count;i++){ 
    NSString *strCat = [allCategory objectAtIndex:0]; 
    NSArray *filteredarray = [productArry filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(category == %@)", strCat]]; 
    [arrayCategoryProductArray addObject : filteredarray]; 
} 
[YOUR_TBL reloadData]; 

Применить фильтр в соответствии с вашими требованиями и проверить результат фильтрации ... А в методе таблицы ....

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

    NSArray *subDataArray = [arrayCategoryProductArray objectAtIndex:section]; 
    return subDataArray.count; 

} 
+0

Я уже отфильтровал категории ... Я хочу только заполнить данные в виде таблицы. @jinal – salmancs43

+0

Тогда его легко отобразить, как показано выше в коде ... Вы можете сделать один из всех данных для определенной категории ... – Bhoomi

+1

Вы получаете это? – Bhoomi