动态部分和行UITableView

时间:2016-11-25 08:09:16

标签: ios objective-c iphone uitableview ipad

我是iOS新手,

我正在使用动态行和部分

开发UITableView

我想显示所有"今天"第一部分的数据,"明天"在其他部分和"星期日"在其他部分等等...

我尝试的代码是,

这是我的数组:

 {
      "callbackSlotId": "1234-1234-3214-1233",
      "callbackSlotName": "10:00-10:30",
      "day": "today",
      "availablenow": true
    },
    {
      "callbackSlotId": "1234-1234-3214-1234",
      "callbackSlotName": "11:00-11:30",
      "day": "today",
      "availablenow": false
    },
    {
      "callbackSlotId": "1234-1234-3214-1235",
      "callbackSlotName": "10:30-11:00",
      "day": "today",
      "availablenow": false
    },
    {
      "callbackSlotId": "1234-1234-3214-1236",
      "callbackSlotName": "10:30-11:00",
      "day": "tomorrow",
      "availablenow": false
    },
    {
      "callbackSlotId": "1234-1234-3214-1237",
      "callbackSlotName": "10:30-11:00",
      "day": "tomorrow",
      "availablenow": false
   },
{
  "callbackSlotId": "1234-1234-3214-1241",
  "callbackSlotName": "10:30-11:00",
  "day": "Sunday",
  "availablenow": false
}
...
...
...

使用此代码,它会在多个部分中显示所有数据:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [Array count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [Array count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdentifier"];

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    cell.textLabel.text=[Array objectAtIndex:indexPath.row];

    return cell;

}

任何人都可以帮助我吗? 感谢您阅读

4 个答案:

答案 0 :(得分:0)

为了解决这种情况,您可以先根据Array变量的值将day分成不同的子阵列。 为此,您可以使用NSPredicate

假设你的主Array有3个不同的值 - today, tomorrow, Sunday那么你的数组将有3个子数组

  • 数组[0]将包含day作为today的所有对象

  • 数组[1]将包含daytomorrow的所有对象,依此类推

现在您可以通过以下代码

使用它
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [Array count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[Array objectAtIndex:section] count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdentifier"];

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    cell.textLabel.text=[[Array objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

    return cell;

}

答案 1 :(得分:0)

未经测试,但您可以使用我的代码来分离您的数组

NSMutableArray *sections = [[NSMutableArray alloc] init];
NSMutableArray *elementsInSection = [[NSMutableArray alloc] init];
for (NSDictionary *dict in Array) {
    NSString *day = [dict objectForKey:@"day"];
    if (![sections containsObject:day]) {
        [sections addObject:day];
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        [arr addObject:dict];
        [elementsInSection addObject:arr];
    } else {
        NSMutableArray *arr = [elementsInSection objectAtIndex:[sections indexOfObject:day]];
        [arr addObject:dict];
        [elementsInSection setObject:arr atIndexedSubscript:[sections indexOfObject:day]];
    }
}

您的tableview数据源现在变为

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [sections count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [elementsInSection count];
}

答案 2 :(得分:0)

它适合我,请在 cellForRowAtIndexPath 方法中试用。

NSDictionary *dict = [_arrMytrips objectAtIndex:indexPath.row];
    NSString *day = [dict objectForKey:@"day"];
        if ([day isEqualToString:@"today"] && indexPath.section == 0) {

            cell.textLabel.text = [dict objectForKey:@"day"];
            cell.detailTextLabel.text = [dict objectForKey:@"day"];

        }else{
            cell.textLabel.text = [dict objectForKey:@"day"];
            cell.detailTextLabel.text = [dict objectForKey:@"day"];
        }

希望它对你有所帮助。谢谢。

答案 3 :(得分:0)

尝试这样的事情:

- (void)viewDidLoad {
    [super viewDidLoad];

    arrayMain = @[yourArray];
    arraySection = [NSMutableArray array];
    [arrayMain enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {

        int flag = 0;
        for(NSDictionary *secObj in arraySection) {
            if ([secObj[@"day"] isEqualToString:obj[@"day"]]) {
                ++flag;
                break;
            }
        }

        if (flag == 0) {
            [arraySection addObject:obj];
        }
    }];
}

然后:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return arraySection.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSMutableArray *arrayOfRows = [NSMutableArray array];

    [arrayMain enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj[@"day"] isEqualToString:arraySection[section][@"day"]]) {
            [arrayOfRows addObject:obj];
        }
    }];

    return arrayOfRows.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    NSMutableArray *arrayOfRows = [NSMutableArray array];

    [arrayMain enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj[@"day"] isEqualToString:arraySection[indexPath.section][@"day"]]) {
            [arrayOfRows addObject:obj];
        }
    }];

    NSDictionary *objectToShow = arrayOfRows[indexPath.row];

    cell.textLabel.text = objectToShow[@"callbackSlotName"];

    return cell;
}

通过此代码,您无需计算任何内容,只需将其放入代码中并相应地更改值即可。如果您有任何疑问,请随时提出。