每个细节视图控制器一个计时器

时间:2013-07-28 03:18:53

标签: iphone ios objective-c uiviewcontroller timer

我有一个带有表视图属性的视图控制器和一个通过导航栏连接到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

我觉得这是实现详细视图控制器的正确方法,因为它最大限度地减少了需要创建的内存量,但它并不能真正满足我的需求。目前,当用户点击一个单元格并轻击并点击另一个单元格时,只会加载第一个单元格的属性。此外,如果我要删除一个单元格,则无法使用此方法使其计时器(我认为)无效。有什么建议吗?

--- ---编辑 我想我应该问的问题是:我应该如何制作它,以便每个细节视图都有一个递减标签(从定时器获取其信息)?

2 个答案:

答案 0 :(得分:2)

您最好的解决方案是在此方案中正确遵循MVC。在你的情况下,你正在为你正在创建的每个detailViewController存储数据(例如任务和倒数计时器/间隔等)。在rdelmar的answer中,他建议你将所有视图控制器存储在mutableArray中。我不同意这两种方法,因为当你关闭视图控制器时你会遇到内存问题(正如你自己所见),而在rdelmar的情况下,你将viewControllers(以及它们引用的数据)存储在一个可变数组中。是浪费。

以这种方式思考..你想在一个地方跟踪数据(这不受影响,现在显示哪个视图..它可能是detailVC 1或100或VC with tableView或其中任何一个)同时,您希望在一次只显示数据源告诉它显示的内容时分配一个 detailVC。这样你可以扩展你的应用程序(想象如果你的表中有数百个索引会发生什么......你会存储数百个视图控制器吗?非常昂贵和冗余)。

所以简单地创建一个singelton .. singelton将有一个mutableArray存储与每个tapped表索引相关的定时器等等.singelton也会在每次点击一个单元格时启动定时器并保持对它(即存储NSIndexPath),这样当你在detail VC和表之间来回跳转时...定时器仍然按照你的要求运行(b / c它们被singelton引用)。 DetailVc只会向singelton询问它应显示的内容并显示它。

希望这会有所帮助。如果您需要进一步澄清,请与我们联系。

答案 1 :(得分:0)

您的代码的问题在于您只创建了一个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的属性。

相关问题