【问题标题】:iOS - return value from heightForRowAtIndexPath after block executediOS - 块执行后从 heightForRowAtIndexPath 返回值
【发布时间】:2014-05-03 11:17:09
【问题描述】:

我是 iOS 开发新手,在我的应用程序中,我需要在 heightForRowAtIndexPath 方法中计算动态表格单元格的高度。

问题是我不想在“回调”块完成之前返回值。objective-c 中有没有办法做到这一点?

这是我的方法实现:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    ...
    SDImageCache *imageCache = [[SDImageCache alloc] init];
    [imageCache queryDiskCacheForKey:model.thumbnail done:^(UIImage *image, SDImageCacheType cacheType)
     {

         // do calculations with height etc.
         // got an error "incompatible block pointer types sending"
         return value;
     }];
}

【问题讨论】:

    标签: ios objective-c callback block heightforrowatindexpath


    【解决方案1】:

    您要么必须同步运行块(即阻塞主线程直到块完成)然后将其返回,要么您需要将计算出的高度存储在存储中并重新加载单元格。第二个选项是首选,因为您不会阻塞主线程和 UI。您可以在占位符单元格上显示加载指示器,一旦获得所有必需的信息,重新加载单元格并正确显示。你可以指定一个动画来使这个重新加载过渡对用户来说是平滑的。

    【讨论】:

    • 谢谢,但是我可以用什么方法重新加载单元格,以及在哪里调用它?
    • 你在表格视图上调用它。 [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    • 正如我所见,reloadRowsAtIndexPaths 为每一行调用 heightForRowAtIndexPath 而不仅仅是更改的那一行..
    • 您不必担心表格视图如何实现其逻辑。它以最高效的方式重新加载行。请记住,当重新加载一行时,其他许多行都需要移动。因此表视图可能需要为其他行调用您的方法。 height 方法应该尽可能快,其中几乎没有开发人员逻辑。
    • 那个也是在reloadRowsAtIndexPaths之后调用的。你需要标记是否应该调用queryDiskCacheForKey,这取决于你是否为特定的索引路径调用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多