重新加载UItableview不会更新标签

时间:2014-09-04 08:38:36

标签: ios objective-c uitableview uilabel

我有一个UITableview,我使用来自网络服务的值填充UITableview。我的UILABEL正确填充了正确的数据。

我的问题是,当我尝试更新UILabel时没有发生任何事情?

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

    static NSString *CellIdentifier = @"nil";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:nil];

    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleSubtitle
                reuseIdentifier:CellIdentifier] ;
    }

    self.tableView.separatorInset = UIEdgeInsetsZero;

    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    // Sets the Label for the cell
    self.hungryPersonOrderStatusLabel = [[UILabel alloc] init];
    self.hungryPersonOrderStatusLabel.frame = CGRectMake(80, 30, 150, 25);
    self.hungryPersonOrderStatusLabel.backgroundColor = [UIColor clearColor];
    self.hungryPersonOrderStatusLabel.textAlignment = NSTextAlignmentJustified;
    self.hungryPersonOrderStatusLabel.font = [UIFont fontWithName:@"SegoeWP" size:13.0];
    self.hungryPersonOrderStatusLabel.textAlignment = NSLineBreakByTruncatingTail;
    self.hungryPersonOrderStatusLabel.numberOfLines = 1;
    self.hungryPersonOrderStatusLabel.text = [[self.viewOrderUserArray valueForKey:@"OrderStatus"] objectAtIndex:[indexPath row]];
    self.hungryPersonOrderStatusLabel.tag = 1001;
    self.hungryPersonOrderStatusLabel.textColor = [UIColor appGreenColor];
    [cell.contentView addSubview:self.hungryPersonOrderStatusLabel];
}

-(void)getOrderDetails 
{

    [self showSpinner];

    DeliNinjaWebService *webService = [DeliNinjaWebService alloc];

    [webService viewOrderDetails:self.deli.deliId  success:^(NSArray *response) 
    {

        NSLog(@"Response Object %@",response );

        [self hideSpinner];

        self.viewOrderDetailsArray = [response mutableCopy];
        self.viewOrderUserArray = [[response valueForKeyPath:@"Orders"] mutableCopy];

        NSString *orderStatusString = [[self.viewOrderUserArray valueForKey:@"OrderStatus"] componentsJoinedByString:@""];

        if ([orderStatusString isEqualToString:@"In Progress"]) 
        {

            self.hungryPersonOrderStatusLabel.textColor = [UIColor appRedColor];
            [self.tableView reloadData];
        }

        [self.tableView reloadData];

    } failure:^(NSString *error) 
    {
        [self hideSpinner];

        NSLog(@"Fail %@", error);

    } noConnection:^
    {
        [self hideSpinner];

        [self showMessage:@"No Connection Error" Message:@"Please check your internet connection"];
    }];
}

我尝试在此处添加标签,然后添加子视图,但没有发生任何事情,tableview没有更新。

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

    static NSString *CellIdentifier = @"nil";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        self.hungryPersonOrderStatusLabel = [[UILabel alloc] init];
        self.hungryPersonOrderStatusLabel.frame = CGRectMake(80, 30, 150, 25);
        self.hungryPersonOrderStatusLabel.backgroundColor = [UIColor clearColor];
        self.hungryPersonOrderStatusLabel.textAlignment = NSTextAlignmentJustified;
        self.hungryPersonOrderStatusLabel.font = [UIFont fontWithName:@"SegoeWP" size:13.0];
        self.hungryPersonOrderStatusLabel.textAlignment = NSLineBreakByTruncatingTail;
        self.hungryPersonOrderStatusLabel.numberOfLines = 1;
        self.hungryPersonOrderStatusLabel.tag = 1001;
        self.hungryPersonOrderStatusLabel.textColor = [UIColor appGreenColor];
        [self.hungryPersonOrderStatusLabel setTag:999];
    }

    UILabel *label = (UILabel *)[cell.contentView viewWithTag:999];
    label.text = [[self.viewOrderUserArray valueForKey:@"OrderStatus"] objectAtIndex:[indexPath row]];

}

enter image description here

3 个答案:

答案 0 :(得分:2)

这是一个简单的错误: -

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

  static NSString *CellIdentifier = @"nil";
  UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:nil];
  ......
  self.hungryPersonOrderStatusLabel.textColor = [UIColor appGreenColor];
}

 -(void)getOrderDetails {
 [self showSpinner];

 if ([orderStatusString isEqualToString:@"In Progress"]) {
    self.hungryPersonOrderStatusLabel.textColor = [UIColor appRedColor];
    [self.tableView reloadData];
  }
  ......
}

首先,在cellForRowAtIndexPath方法中,您的设置标签颜色为绿色,然后在getOrderDetails方法中将您的标签颜色设置为红色,但是当您重新加载方法时,它再次仅采用绿色。所以最后不会有颜色变化。

所以你应该带一个bool标志,即statusFlag(最初它将为false)所以代码将是(在cellForRowAtIndexPath方法中)

 if(statusFlag)
    self.hungryPersonOrderStatusLabel.textColor = [UIColor appGreenColor];
 else
    self.hungryPersonOrderStatusLabel.textColor = [UIColor appRedColor];

同样在你的cellForRowAtIndexPath方法中,

self.hungryPersonOrderStatusLabel.backgroundColor = [UIColor clearColor];   //Which is clear and not changing it at any place.

所以你可以用if条件和标志来改变它。

答案 1 :(得分:0)

试试这个..

在更换标签后,您正在重新加载表格视图,因此标签的颜色再次设置为您在cellForRowAtIndexPath方法中指定的颜色。删除该行

self.hungryPersonOrderStatusLabel.backgroundColor = [UIColor clearColor]; in `cellForRowAtIndexPath` method

将该行放在viewDidloadviewWillAppear方法

答案 2 :(得分:0)

您忘记在第二部分设置[cell.contentView addSubview:self.hungryPersonOrderStatusLabel];

if (cell == nil) 
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    self.hungryPersonOrderStatusLabel = [[UILabel alloc] init];
    self.hungryPersonOrderStatusLabel.frame = CGRectMake(80, 30, 150, 25);
    self.hungryPersonOrderStatusLabel.backgroundColor = [UIColor clearColor];
    self.hungryPersonOrderStatusLabel.textAlignment = NSTextAlignmentJustified;
    self.hungryPersonOrderStatusLabel.font = [UIFont fontWithName:@"SegoeWP" size:13.0];
    self.hungryPersonOrderStatusLabel.textAlignment = NSLineBreakByTruncatingTail;
    self.hungryPersonOrderStatusLabel.numberOfLines = 1;
    self.hungryPersonOrderStatusLabel.tag = 1001;
    self.hungryPersonOrderStatusLabel.textColor = [UIColor appGreenColor];
    [self.hungryPersonOrderStatusLabel setTag:999];
    [cell.contentView addSubview:self.hungryPersonOrderStatusLabel]; // <------
}

另外你的

UILabel *label = (UILabel *)[cell.contentView viewWithTag:999];

将找不到标签;)

和...为什么使用

self.hungryPersonOrderStatusLabel.tag = 1001;

[self.hungryPersonOrderStatusLabel setTag:999];

? ;)

也不需要在if语句中调用[self.tableView reloadData];,因为你再次在下一行调用它。

if ([orderStatusString isEqualToString:@"In Progress"]) {

    self.hungryPersonOrderStatusLabel.textColor = [UIColor appRedColor];
    [self.tableView reloadData]; // <----
}

[self.tableView reloadData];

并将两个语句切换为

[self.tableView reloadData];
if ([orderStatusString isEqualToString:@"In Progress"]) 
{
    self.hungryPersonOrderStatusLabel.textColor = [UIColor appRedColor];
}

也许你甚至不需要在这里调用reloadData如果只改变颜色而你把标签保存为属性