【问题标题】:UILabel text in non-reusable UITableView cell can't be set无法设置不可重用 UITableView 单元格中的 UILabel 文本
【发布时间】:2015-12-16 20:31:36
【问题描述】:

我决定在我的项目中使用不可重用的自定义 UITableView 单元,因为我在每个单元中运行一个计时器,并且使用可重用单元更新一个单元的计时器会重置所有计时器。实际上,计时器正在我的视图控制器中运行,但输出显示在单元格中。但是这个问题要基本得多:为什么单元格中 UILabel 中的文本没有更新?我在 IB 中设置了 2 个插座:nameLabel 和 timeLabel,并将它们连接到单元格的头文件,IB 显示连接的插座。但是,即使尝试将文字字符串移动到 UILabel 文本字段中也会导致“nil”。我怀疑我做的事情基本上是错误的,但我无法弄清楚。当我使用可重复使用的电池时没有问题。这是分配和初始化一个可变数组以保存单元格的代码部分,添加一个单元格,然后尝试将文字字符串移入其中。在 NSLog 语句处设置断点显示 cell.nameLabel.text 为“nil”。任何帮助将不胜感激!我已经阅读了 UITableViewCell 参考和编程指南,但他们只讨论了使用可重复使用的单元格。我认为将reuseIdentifier设置为'nil'会得到一个不可重用的单元格,但我不确定。

    -(IBAction)addNewItem:(id)sender
{
   // get a new item.
    NRCItem *newItem = [[NRCItemStore sharedStore] createItem];

    // set timerType to 1 (seconds) - default
    newItem.timerType = 1;

    // get a timer controller
    NRCTimerControllerViewController *timerViewController = [[NRCTimerControllerViewController alloc]init];

    // set timer controller's item
    timerViewController.item = newItem;

    // get a new tableViewCell

    if(!_myTableViewCells){
        _myTableViewCells = [[NSMutableArray alloc]init];
    }

        NRCItemCell *cell = [[NRCItemCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
        cell.nameLabel.text =@"cell";
        NSLog(@"addTableViewCell cell= %@", cell);

        [_myTableViewCells addObject:cell];

    // push the timerViewController onto the navigation controller's stack
    [self.navigationController pushViewController:timerViewController animated:YES];

}

在此处输入代码

【问题讨论】:

  • 你能展示你的cellForRowAtIndexPath方法吗?顺便说一句,正确的方法是您需要将数据模型与单元格分开。例如,使用一个 NSNumber 数组,每个 NSNumber 代表一行中经过的时间。在单个计时器方法中更新所有计数并使用cellForRowAtIndexPath 检索显示的单元格并更新它们。
  • 这里是现在工作的代码。我不确定发生了什么变化,但也许我没有设置委托来设置标签文本。

标签: ios uitableview


【解决方案1】:

我想我没有在 xib 文件中设置委托。代码现在可以工作了。

    - (IBAction)addNewItem:(id)sender
{
    // control comes here when a new item is requested by the user, for example.
    // by clicking on a button in the view's navigation bar


    NRCtimerItem *item = [[NRCItemStore sharedStore]createItem];


    NRCDetailViewController *controller = [[NRCDetailViewController alloc]init];
    self.timerItem = item;
    self.timerItem.timerSet = NO;
    self.timerItem.resetHistory = [[NSMutableArray alloc]init];
    // Give detail view controller a pointer to the item object in row
    controller.item = item;
    controller.timerLabels = self.timerLabels;
    controller.delegate = self;

    // Push it onto the top of the navigation controller's stack
    [self.navigationController pushViewController:controller
                                         animated:YES];

    // add the row to tableView
    NSUInteger row =[[[NRCItemStore sharedStore]allItems] indexOfObject:item];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    self.timerItem.timerSet = YES;
}

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Get a new or recycled cell
    NRCItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NRCItemCell" forIndexPath:indexPath];

    NRCtimerItem *item = [[[NRCItemStore sharedStore]allItems]objectAtIndex:indexPath.row];
    self.timerItem = item;
    if(self.timerItem.timerSet ==NO){
        return cell;
    }
    // ******************************
    else{

    [self handleTimer];

    return cell;
    }
}
    -(void)handleTimer{

    if(self.timerItem.timerSet == NO)
    {
    self.timerItem.timerSet = YES;
        if(self.timerItem.timerReset == NO)
        {
            self.timerItem.startTime = [NSDate date];
            //self.timerItem.lastReset = [NSDate date];
            NSLog(@"Setting current date/time to %@", self.timerItem.startTime);
        }
    switch (self.timerItem.timerType) {
        case 0:// date only
        {
            self.timerItem.interval = 0.5;
        }
            break;
        case 1:// seconds
        {
            NSTimeInterval timeInterval = 1;
            self.timerItem.interval = timeInterval;
        }
            break;
        case 2:// minutes
        {
            NSTimeInterval timeInterval = 60;
            self.timerItem.interval = timeInterval;
        }
            break;
        case 3:// hours
        {
            NSTimeInterval timeInterval = 3600;
            self.timerItem.interval = timeInterval;
        }
            break;
        case 4:// days
        {
            NSTimeInterval timeInterval = 3600*24;
            self.timerItem.interval = timeInterval;
        }
            break;
        case 5:// months
        {
            NSTimeInterval timeInterval = 3600*24*30;
            self.timerItem.interval = timeInterval;
        }
            break;
        case 6:// years
        {
            NSTimeInterval  timeInterval = 3600*24*365;
            self.timerItem.interval = timeInterval;

        }
            break;
        }
            NSLog(@"Date/time was set to %@", self.timerItem.startTime);

            NSTimeInterval interval =[self.timerItem.startTime timeIntervalSinceNow];
            interval = (-1 * interval);
            if(self.timerItem.interval && self.timerItem.interval >= interval){
                self.timerItem.interval = self.timerItem.interval - interval;
            }
        }


    //NSLog(@"timer %@ fired", self.timerItem.timerName);

    // here we schedule the timer to fire after an interval based on the timerType.
    self.timerItem.timer = [NSTimer scheduledTimerWithTimeInterval:self.timerItem.interval target:self selector:@selector(calculateTimer:) userInfo:self.timerItem repeats:YES];



    [self.timerItem.timer fire];


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多