【问题标题】:UITableView via NSFetchedResultsControllerDelegate, select first record by default?UITableView通过NSFetchedResultsControllerDelegate,默认选择第一条记录?
【发布时间】:2012-12-03 12:53:42
【问题描述】:

我有一个 UITableView,它通过实现 NSFetchedResultsControllerDelegate 的控制器从 CoreData 填充。如何让它自动选择第一行(并触发 tableView:didSelectRowAtIndexPath 消息)?

tableview 用于各种谓词查询,因此我对适用于 UIViewController 生命周期(viewDidLoad 等)的解决方案持怀疑态度,但我是该平台的新手,所以我很开放。

我已经尝试了很多方法,但我不确定将它放在调用堆栈中的哪个位置。我尝试在 tableView:cellForRowAtIndex: 方法中调用cell.selected = true,但这最终只是将单元格变为黑色(并且不会触发选定的回调方法)

一个关于所有委托和核心数据协议的问题,是否意味着异步数据获取(多线程)?还是 NSFetchedResultsController 在同一个线程中调用其所有相关方法?也许我只是害怕如果它是异步的,就会出现以后很难排除故障的竞争条件。

【问题讨论】:

    标签: cocoa-touch core-data


    【解决方案1】:

    尚无法添加 cmets 来询问您在选择单元格时要尝试做什么,所以我将不得不猜测。

    如果你想将单元格标记为选中,那么你应该使用附件类型属性,例如:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ...
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        ...
    }
    

    另一方面,如果您尝试基于选择第一个单元格来执行一些逻辑,甚至显示一个新视图,那么该逻辑应该在一个方法中,您可以在数据加载后简单地调用该方法。

    【讨论】:

    • 我的目标是在 didSelectRowAtIndexPath 中添加逻辑以在另一个视图中显示数据。本质上是数据模型的向下钻取。我的差距正是“加载数据后调用的方法”。事实证明这是一个“duh”。我被困在我的 webdeveloper ajax 常规中,表加载是异步发生的,所以我从来没有考虑过我应该找到第一行并在调用 fetchedResultsController.performFetch 后立即选择它:谢谢你让我放松。
    【解决方案2】:

    这样做:

    if (indexPath.section == 0 && indexPath.row == 0) {
       //select first row by default
       [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
       //then populate detail view with corresponding managedObject
       [self tableView:tableView didSelectRowAtIndexPath: indexPath];
    }
    

    当然,这是假设您已经正确编码了 didSelectRowAtIndexPath。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多