每细节视图控制器的一个计时器(one timer per detail view controlle

2019-10-30 10:32发布

我有一个表视图属性,并通过导航栏连接到每个细胞中的tableview的细节视图控制器的视图控制器。 在详细视图控制器是一个倒计时的计时器,以指定的时间间隔当用户创建的任务。 我想使它所以每个单元(或任务)具有独特的细节视图控制器。 我使用的核心数据。 这是我现在有:

-(void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    if (!self.detailViewController) {
        self.detailViewController = 
            [[DetailViewController alloc] initWithNibName:@"DetailViewController" 
                                                   bundle:nil];
    }
        Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
        self.detailViewController.testTask = task;
        [[self navigationController] pushViewController:self.detailViewController 
                                               animated:YES];

}

DetailViewController.m

@interface DetailViewController : UIViewController <UIAlertViewDelegate>
@property (weak, nonatomic) IBOutlet UILabel *timeLeft;
@property (weak, nonatomic) IBOutlet UILabel *timerLabel;
@property (nonatomic, strong) Tasks *testTask;
@end

我觉得这是落实细节视图控制器,因为它最大限度地减少内存中需要创建的金额正确的方法,但是它并没有真正适合我的需要。 目前,当用户点击一个细胞,并回水龙头,水龙头和不同的细胞中,只有第一个单元格的属性被加载。 另外,如果我要删除一个单元就没有办法用这种方法无效的定时器(我认为)。 有什么建议么?

---编辑---我想我应该问的问题是:我应该如何让这个每一个细节视图有一个递减的标签(即从计时器获取信息)?

Answer 1:

与您的代码的问题在于,你只创建DetailViewController的一个实例,所以每个单元推到同一个。 你必须有在didSelectRowAtIndexPath方法某种程度上看指数路径,并用它来确定去哪个DetailViewController的实例。 要做到这一点的方法之一是创建一个可变字典抱到DetailViewController的实例的引用。 你可以有钥匙是对应indexPath.row NSNumbers,和值将是DetailViewController的一个实例。 所以,你的代码可能是这个样子:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    DetailViewController *detailVC;
    if (![self.detailControllersDict.allKeys containsObject:@(indexPath.row)]) {
        detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
        [self.detailControllersDict setObject:detailVC forKey:@(indexPath.row)];
    }else{
        detailVC = self.detailControllersDict[@(indexPath.row)];
    }
    Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    detailVC.testTask = task;
    [[self navigationController] pushViewController:detailVC animated:YES];

}

detailControllersDict是属性指向一个NSMutableDictionary。



Answer 2:

你最好的解决办法是正确遵循MVC在这种情况下。 在你的情况,你是否正存储所创建的每个detailViewController数据(如任务,倒数计时器/间隔等)..并在rdelmar的回答 ,他是在暗示你存储在mutableArray所有视图控制器。 我有两种方法不同意和你将有内存问题,当您关闭视图控制器(如u've看到自己)和rdelmar的情况下,你(与它们所引用的数据一起)的可变数组存储viewControllers ..这是一种浪费。

想想这样..你要跟踪的数据在一个地方(这是与观点上显示现在..它可能是detailVC 1或100或与的tableView或任何的VC不受影响),并在同时要在简单地显示任何数据源告诉它显示的时间分配一个 detailVC。 这样,你可以扩展你的应用程序(想象一下,如果你在你的表有数百个指标的..你会存储数百视图控制器?非常昂贵和多余的会发生什么)。

所以只需创建一个singelton ..的singelton将具有存储有关各抽头表的索引等计时器一个mutableArray ..的singelton还将推出定时器每一个细胞被窃听的时间,并保持对它的引用(即存储NSIndexPath),这样当你来回跳转detailVCs与表之间..计时器仍然在运行所要求的你(b / C它们是由singelton引用)。 该DetailVc会简单地问自己应该显示器和显示它的singelton。

希望这可以帮助。 请让我知道如果你需要任何进一步澄清。



文章来源: one timer per detail view controller