我想操作NSMutableArray
数组控制器的属性,该属性作用于 的内容NSMatrix
,而不必手动将单元格添加NSMatrix
到它所绑定的单元格。
我在这上面花了很多时间,但无济于事。
任何帮助将不胜感激。
我有一个以编程方式创建的NSMatrix
模式NSListModeMatrix
。在我的NSArrayController
子类中,我用 4 个虚拟对象填充一个NSMutableArray
开始,代表 4 行和 1 列数据。然后我将填充的矩阵绑定到该矩阵NSMutableArray
:
interface:
@property (nonatomic, strong) NSMutableArray *myArray;
implementation (init):
NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];
[bindingOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInsertsNullPlaceholderBindingOption];
[bindingOptions setObject:[NSNumber numberWithBool:YES] forKey:NSRaisesForNotApplicableKeysBindingOption];
[matrix bind:@"content"
toObject:self
withKeyPath:@"myArray"
options:bindingOptions];
现在我想向矩阵添加列。对于第一次添加,这意味着一组单元格在位置 1、3、5、7 处被索引,col=1。NSMatrix
这是由于支持内容数组的从左到右、从上到下的性质:
NSInteger colCount = [matrix numberOfColumns];
NSInteger rowCount = [matrix numberOfRows];
NSMutableArray *newList = [[NSMutableArray alloc] init];
NSMutableIndexSet *myIndexes = [[NSMutableIndexSet alloc] init];
for (NSInteger i=0; i<rowCount; i++) {
[newList addObject:[[NSCell alloc] init]];
[myIndexes addIndex:col+colCount*i];
}
现在,这就是我想做的事情:
[self.myArray insertObjects:newList atIndexes:myIndexes];
希望NSMatrix
会自动更新。但是,唉,没有。
我可以NSLog
确认数组的大小正在增加(并且布局正确),但除非我执行以下操作,否则 UI 中没有任何更新:
// update the `NSMatrix` manually
[matrix insertColumn:col withCells:newList];
// update the underlying array
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:myIndexes forKey:@"myArray"];
[self.myArray insertObjects:newList atIndexes:myIndexes];
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:myIndexes forKey:@"myArray"];
如果我省略第一行,NSMatrix
则完全空白。
如果我省略第二行和最后一行(willChange
/ didChange
)并保留第一行,则矩阵仅显示默认的单列。
不过,在所有情况下,我都看到底层数组的大小和排列都在正确增长。
但我只想更新底层的可变数组,而不必为NSMatrix
自己添加列。
我如何才能NSMatrix
一起玩?
PS:我可以通过这样做将上述 4 行缩短为 2 行,放弃 will/did 行:
[matrix insertColumn:col withCells:newList];
[[self mutableArrayValueForKey:@"myArray"] insertObjects:newList atIndexes:myIndexes];