0

我有一个带有表格视图属性的视图控制器和一个通过导航栏连接到表格视图中每个单元格的详细视图控制器。在详细视图控制器中是一个倒数计时器,在用户创建任务时指定了一个时间间隔。我试图让每个单元格(或任务)都有一个独特的细节视图控制器。我正在使用核心数据。这就是我现在所拥有的:

-(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];

}

细节视图控制器.m

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

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

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

4

2 回答 2

2

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

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

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

希望这可以帮助。如果您需要任何进一步的说明,请告诉我。

于 2013-07-28T05:24:25.700 回答
0

您的代码的问题在于您只创建了一个 DetailViewController 实例,因此每个单元格都推送到同一个单元格。您必须在 didSelectRowAtIndexPath 中有某种方式来查看索引路径并使用它来确定要转到的 DetailViewController 实例。一种方法是创建一个可变字典来保存对 DetailViewController 实例的引用。您可以让键是对应于 indexPath.row 的 NSNumber,值是 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 的属性。

于 2013-07-28T05:03:46.050 回答