我正在使用一个NSArrayController,NSMutableArray并NSTableView显示我自己的自定义对象的列表(虽然这个问题可能适用于你只是显示一个香草NSString对象的列表).
在不同的时间点,我需要清除我的数组并刷新数据源中的数据.但是,只是调用removeAllObjects我的NSMutableArray对象不会触发KVO更新,因此屏幕上的列表保持不变.
NSArrayController有没有 removeAllObjects可用的方法,这似乎很奇怪.(它确实有addObject,我用它来添加对象,确保触发KVO并更新UI.)
我设法导致这种情况正确发生的最干净的方法是:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
Run Code Online (Sandbox Code Playgroud)
...所以我有点必须自己手动进行KVO通知(这是在我的测试app类中,包含myArray属性,NSMutableArray如上所述.)
这似乎不对 - 有更好的方法吗?从我的谷歌搜索,似乎有几个人因缺乏的困惑removeAllObjects中NSArrayController,但还没有看到任何更好的解决方案.
我见过这个解决方案:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
Run Code Online (Sandbox Code Playgroud)
但这看起来对我来说更加不愉快.至少我的解决方案至少是自我记录.
Apple没有注意到有时人们可能想要清空通过NSArrayController对象管理的列表控件吗?这看起来很明显,所以我想我一定错过了什么......
除此之外:当然,如果我向数组添加新项目(via NSArrayController),那么这将触发KVO更新NSArrayController/NSTableView,但是:
我正在尝试建立一个NSCollectionView(我过去成功完成了这个,但由于某种原因,这次失败了).
我有一个名为"TestModel"的模型类,它有一个NSString只返回一个字符串的属性(仅用于测试目的).然后NSMutableArray我在我的主app appate类中有一个属性声明,并且我在这个数组中添加了该TestModel对象的实例.
然后我有一个Array Controller,它的内容数组绑定了app delegate NSMutableArray.我可以确认到目前为止的一切工作正常; NSLogging:
[[[arrayController arrangedObjects] objectAtIndex:0] teststring]
Run Code Online (Sandbox Code Playgroud)
工作得很好.
然后,我为集合视图设置(itemPrototype和内容)以及集合视图项(视图)提供了所有适当的绑定.然后,我在集合项视图中有一个绑定到Collection View的文本字段Item.representedObject.teststring.但是,当我启动应用程序时,NOTHING会显示在集合视图中,只是一个空白的白色屏幕.我错过了什么?
更新:这是我使用的代码(由wil shipley请求):
// App delegate class
@interface AppController : NSObject {
NSMutableArray *objectArray;
}
@property (readwrite, retain) NSMutableArray *objectArray;
@end
@implementation AppController
@synthesize objectArray;
- (id)init
{
if (self = [super init]) {
objectArray = [[NSMutableArray alloc] init];
}
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
TestModel *test = [[[TestModel alloc] initWithString:@"somerandomstring"] autorelease];
if …Run Code Online (Sandbox Code Playgroud) cocoa objective-c nsarraycontroller nscollectionview nscollectionviewitem
我需要一些帮助来弄清楚崩溃报告中可能发生的事情.这对我来说是一个不可重现的问题,但有些用户在发布时会反复遇到这种情况.
当应用程序启动时,我将一个包含NSObjectController的nib加载到一个ContactsListDisplaySource对象,以及一个NSArrayController peopleArrayController(它是ContactsListDisplaySource对象内部的一个插座).peopleArrayController是从数据库中获取联系人列表的内容ContactsListDisplaySource refetchArrayController]:
- (void) refetchArrayController {
NSError *error = nil;
[_peopleArrayController fetchWithRequest:nil merge:NO error:&error];
if (error) {
NSLog(@"error in peopleArrayController fetch = %@", error);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,这是从awakeFromNib,并使用fetch:而不是fetchWithRequest:merge:error返回0行
这有99%的时间可以工作,但我想弄清楚这个崩溃报告中发生了什么.崩溃报告中是否有任何可以解释问题的线索?
Date/Time: 2015-04-22 12:17:17 +0000
OS Version: Mac OS X 10.10.3 (14D136)
Report Version: 104
Exception Type: SIGSEGV
Exception Codes: SEGV_NOOP at 0x0
Crashed Thread: 0
Thread 0 Crashed:
0 libsqlite3.dylib 0x00007fff8e3770ad sqlite3VdbeHalt + 7741
1 libsqlite3.dylib 0x00007fff8e3bd9c7 …Run Code Online (Sandbox Code Playgroud) 我有一个包含一些元素的NSArrayController.这些元素有一些属性,如"名称","信息"等.
我想要的只是在NSArrayController中找到一个名称属性设置为的元素,比方说,'Mads'.
由于效率不是一个很大的问题,我只需要通过迭代NSArrayController中的所有元素进行线性搜索,同时检查'name'属性是否为'Mads'.
但我似乎无法从NSArrayController获得NSIterator,所以我想知道是否还有另一种方法可以做到这一点?
任何帮助表示赞赏
我有一个绑定到NSArrayController的NSTableView.我想有一个表列显示表行的索引.当你自己实现NSTableDataSource时,这很容易做到,但我无法用绑定表视图来解决它.我想我在这里寻找类似于@count键路径的东西,它给了我arrangeWebs的数量(即@index),但这显然是缺失的.
两个澄清:
我的应用程序中有一个iTunes样式界面:左侧的源列表(NSOutlineView)包含不同的库和播放列表,界面右侧显示NSTableView,显示"演示文稿"的信息.与iTunes类似,我在表格视图中显示相同类型的信息是否选择了库或播放列表(标题,作者,创建日期等).

我目前有一个连接到我的NSTableView的NSArrayController,并根据源列表中选择的内容设置fetch谓词.这在选择库时工作正常,因为我可以设置fetch谓词来过滤我的Presentation Core Data实体中的"type"字段.但是,当我尝试调整播放列表的获取谓词时,看起来没有任何方法来设置获取谓词,因为我在播放列表和演示文稿之间有一个表来跟上播放列表中的顺序.根据Apple文档,这些类型的谓词不适用于Core Data(它基本上没有多个内连接).以下是我的数据模型的相关部分.

我的数据模型设置不正确吗?我应该放弃NSArrayController并手动连接NSTableView吗?我想弄清楚是否有一个简单的修复,或者真的是一个设计缺陷.
我只是想能够使用名为remove的nsarraycontroller的方法:并添加:
我遇到问题,NSManagedObject没有反映在后台线程保存上下文后对持久存储所做的更改.
安装程序
在一个简单的测试应用程序中,我有一个窗口列出了我的核心数据持久存储中的所有对象,一个用于过滤结果的搜索框和一个用于显示所选项目名称的文本字段,并允许更改名称.
绑定如下:
ArrayController --> AppDelegate --> ManagedObjectContext TableView Col 1 --> ArrayController --> values --> arrangedObjects.widgetName TableView Col 2 --> ArrayController --> values --> arrangedObjects.uid SearchField --> ArrayController --> predicate --> filterPredicate TextField --> ArrayController --> value --> selection.widgetName
我还有一个按钮,用于启动从Web服务器获取数据的后台(NSOperation).
过程
当用户单击刷新按钮时,NSOperation将启动并异步抓取窗口小部件,解析响应,检查要删除的不在响应中的本地窗口小部件,要添加的新窗口小部件未存储在本地和现有本地应使用从服务器检索的数据更新的小部件.
处理完成后,将使用以下方式通知主要上下文:
[mainContext performSelectorOnMainThread:
@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)
我在主控制器中有一个观察者进行测试,显示变化经过了很好,主控制器得到了通知.
问题
如果我使用文本字段对选定对象进行更改,则在保存后台线程上的数据时,UI中的对象不会更新以反映这些更改(即,它不会覆盖具有更改的UI)服务器).
例如,给出以下三个小部件和ID:
Test Name 1 | ID 123 Test Name 2 | ID 234 Test Name 3 | ID 345
如果我的UI更改名称Test Name 2到Renamed 2我有以下几点: …
objective-c background-process nsarraycontroller cocoa-bindings nsmanagedobjectcontext
我有一个图像数组和两个nib文件.一个nib文件有一个窗口,在NSTableView中显示图像.另一个笔尖有一个窗口,可以将图像数组绘制到NSView中,还可以在所选图像上绘制一个突出显示.
图像数组由NSArrayController控制.我无法让两个笔尖共享NSArrayController.我会有两个单独的NSArrayControllers绑定到相同的内容,但我也希望两个笔尖共享控制器的选择; 也就是说,如果在表格窗口中选择图像,它也会在另一个窗口中被选中.
有没有标准的方法来做到这一点?
在我的应用程序中,我直接将对象添加到ArrayController.当我想要清理我做的所有物品时:
[[downloadItemsController content] removeAllObjects];
Run Code Online (Sandbox Code Playgroud)
但是,此命令不会刷新arraycontroller绑定的TableView.如果我删除所有项目并添加另一个新项目,我只会看到该项目.这很好,但如果我不添加任何东西,我仍然有我的所有项目在表中.
如果我做
[downloadItemsController prepareContent];
Run Code Online (Sandbox Code Playgroud)
所有旧项目都从tableview中删除,但我会得到一个我可以编辑的新的空项目.我不希望这样,因为我的一个列有一个复选框,我总是得到一个带复选框的行.
删除所有现有项目后,我只需要一个没有项目的空表.