0

我有一个带有 a 的 UITableView property(strong, nonatomic)NSMutableArray *currentContent,我还有一个property(strong, nonatomic)NSMutableArray *cellHeights来跟踪单元格的高度,因为用户可以展开或折叠每个单元格。这self.currentContent是由另一个从 Web 服务加载数据的控制器设置的,所以它会随着数据加载而改变,我希望这两个变量保持同步。一currentContent更新就想更新cellHeights。我怎么做?

我试过了:

- (void)setCurrentContent:(NSMutableArray *)currentContent{
    _currentContent = currentContent;
    self.cellHeights = [NSMutableArray arrayWithDefaultHeightsForCellCount:[currentContent count]];
}

但它不起作用,因为它只会在我第一次设置时设置currentContent,当它为空时。所以self.cellHeights目前将保持空白。当 中最终有值时self.currentContentself.cellHeights未更新。

4

2 回答 2

1

我之前做过类似的事情,不同的单元格高度取决于您的网络服务中的内容,我建议保留一系列单元格高度可能不是最好的主意。

我所做的是在 viewDidLoad: 方法中创建一个“假”单元格,我只使用它来计算单元格高度。

然后我使用“heightForRowAtIndexPath”方法来指定单元格的高度,方法是用索引路径的数据填充“假”单元格,然后找出该单元格的高度。例如:

@interface MyTableViewController()

@property (nonatomic, strong ) MyCustomTableViewCell *cellForTestingHeight;

@end




@implementation MyTableViewController

- (void)viewDidLoad {
   [super viewDidLoad]

   self.cellForTestingHeight = [[MyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *myData = [self.data objectAtIndex:indexPath.row];
    self.cellForTestingHeight.viewData = myData;

    return self.cellForTestingHeight.height;
}

@end

这段代码假定您创建了一个名为 MyCustomTableViewCell 的类,该类具有设置 viewData 属性的方法,并且在设置该属性后,您将能够通过访问 height 属性来判断该单元格的高度。

于 2013-06-18T01:51:59.280 回答
0

你需要做的是观察可变数组本身的变化,而不是你引用数组的属性。这应该很简单,但不幸的是有一个转折......

好的,让我们假设没有扭曲,而不是NSMutableArray你的属性是 type MyObservableClass。然后设置观察你会做这样的事情(所有代码都是伪的 - 即输入答案):

- (void)setCurrentContent:(MyObservableClass *)currentContent
{
   if(_currentContent)
      [_currentContent removeObserver:self forKeyPath:@"myObservableProperty"];

   _currentContent = currentContent;
   [_currentContent addObserver:self forKeyPath:@"myObservableProperty" ...];
}

现在,无论何时currentContent更改,您的代码都会停止观察其旧值的属性并开始观察其新值的属性。

很简单,但对于数组来说并不是那么简单......

不同的是,尽管 KVO 会通知观察者对集合的添加、删除和更改,但NSMutableArray该类不会发出这些通知。您需要为数组使用代理,框架提供了这样的代理 - 参见示例NSArrayControllermutableArrayValueForKey:. 然而,扭曲的第二部分是对数组的更改必须通过此代理完成 -如果您要观察它,您不能让您的客户端调用setCurrentContent并传递任何内容,您的客户端需要传入代理.. NSMutableArray. 你是否可以在你的设计中轻松使用它,你必须弄清楚。您需要阅读本文档和其他 Apple 文档中的自动更改通知来解决这个问题。

这听起来更复杂,它需要,也许其他人会提供一种更简洁的方式来做到这一点。

于 2013-06-18T03:42:45.317 回答