我正在尝试创建一个NSTableView使用NSArrayController和可可绑定的分段.我正在寻找类似于NSFetchedResultsControlleriOS 的类似方法,您可以在其中设置部分键路径.我想做类似的东西NSArrayController.
我举个例子:我有不同的任务.每项任务都有三个不同的优先级之一,低,中或高.任务还具有标题,描述,日期等属性.我想按优先级划分或分组任务(此处的部分键路径是优先级).
你可以用绑定来解决这个问题NSArrayController吗?我需要多个NSArrayController还是只需一个?
我有一个NSView子类,它绑定到arrangedObjects一个NSArrayController.当数组插入或删除项目时,将通知视图.如果存储在数组中的模型的属性发生了变化,如何通知它?
我是否需要将我的视图作为观察者添加到添加到数组中的每个项目的每个(相关)属性?
当一个项目添加到数组或从数组中删除时observeValueForKeyPath:ofObject:change:context:,我会通过我的NSView子类通知我.我没有收到存储在数组中的模型更改的通知,但我可以在每次收到插入通知时,将视图作为观察者添加到新项目的属性中.这是最好的方法吗?
我addObserver为模型类进行了覆盖,以便我可以看到发生了什么,并注意到NSTableView绑定到的列arrangedObjects将自己添加为适当属性的观察者.这可以自动发生还是我手动设置观察?
cocoa objective-c key-value-observing nsarraycontroller cocoa-bindings
好的,这是我的情况:
NSMutableArray绑定到NSTableView,通过NSArrayController.NSArrayController's selectNext:和selectPrevious:问题是:选择确实发生了变化,但表视图不会滚动到当前选择,因此其内容是可见的.
我该怎么办?有任何想法吗?
假设我在核心数据模型中存储了一堆Article对象.每篇文章都维护一个阅读进度属性,该属性表示用户已阅读了多少文章.一旦用户完全阅读了该文章,该文章就被标记为"阅读".在此之前,它将标记为"未读".
现在我有一个绑定到NSArrayController的NSTableView,其中包含使用CoreData存储的所有Article对象.我希望它显示"未读"组下的所有未读文章,以及"阅读"组下的所有阅读文章.
我知道这个方法
- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row
Run Code Online (Sandbox Code Playgroud)
在NSTableViewDelegate中.但是,这暗示我们必须在NSArrayController中将实际行说"读"和"未读",这些行将被提升为组.由于NSArrayController包含从CoreData中提取的Article对象,我该如何进行此操作?
NB:这是我的第一个问题,我是Cocoa的新手,请放轻松我:)
所以我习惯了iOS开发,所以我对NSFetchedResultsController非常满意.但是,这在Mac OS X环境中不存在.我知道我可以使用NSArrayController作为替代品.我可能正在使用这个类非常错误,但它一直工作到现在.我初始化NSArrayController如下:
NSArrayController* newConversationsController = [NSArrayController new];
newConversationsController.managedObjectContext = context;
newConversationsController.entityName = entityName;
newConversationsController.sortDescriptors = sortDescriptors;
newConversationsController.automaticallyRearrangesObjects = YES;
NSError* error = nil;
[newConversationsController fetchWithRequest:nil merge:NO error:&error];
NSCAssert(!error, error.description);
Run Code Online (Sandbox Code Playgroud)
然后我听取NSManagedObjectContext的更改并获取并重新加载NSTableView,如下所示:
[self.conversationsController fetchWithRequest:nil merge:YES error:&error];
NSAssert(!error, error.description);
[self.tableView reloadData];
Run Code Online (Sandbox Code Playgroud)
正如我之前提到的,我可能使用这个完全错误,但我不喜欢使用绑定.现在来看实际问题:应用程序的另一个类可能会删除NSArrayController持有的NSManagedObject.NSArrayController立即释放这个删除的对象,使我无法确定哪个对象.最终目标是知道什么索引被删除了哪个对象,这样我就可以为NSTableView的行设置动画.
我希望我的目标很明确.谢谢你的帮助
这让我困惑了好几个小时......
我有一个对象(CuesDoc)具有属性(NSMutableArray *cuesArray)和一些其他属性.该cues数组包含多个Cue对象.(CuesDoc*) currentCuesDoc在我的房子里有一个叫做的房产AppDelegate.
在IB,我有一个NSArrayController,这是必然的AppDelegate.currentCuesDoc.cuesArray.
我有一个NSTableView绑定的NSArrayController,可以在表和cuesArray中添加/删除/编辑值.到现在为止还挺好.
我有下面的详细信息字段,它们被绑定到NSArrayController.selection,每个属性都设置了模型密钥路径.
当视图首次出现时,详细信息字段将填充表视图中第一个项目的内容,但是当我选择其他行时,详细信息字段不会更新以反映当前选择.
我增加了一个观察员selectionIndexes和selection为NSArrayController,并认为出现的时候,我得到所要求的observeValueForKeyPath:方法一次,但不改变选择后.
我正在尝试建立一个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
我无法让核心数据支持的NSArrayController在我的代码中正常工作.以下是我的代码:
pageArrayController = [[NSArrayController alloc] initWithContent:nil];
[pageArrayController setManagedObjectContext:[self managedObjectContext]];
[pageArrayController setEntityName:@"Page"];
[pageArrayController setAvoidsEmptySelection:YES];
[pageArrayController setPreservesSelection:YES];
[pageArrayController setSelectsInsertedObjects:YES];
[pageArrayController setClearsFilterPredicateOnInsertion:YES];
[pageArrayController setEditable:YES];
[pageArrayController setAutomaticallyPreparesContent:YES];
[pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]];
BOOL result = [pageArrayController setSelectionIndex:0];
Run Code Online (Sandbox Code Playgroud)
当我尝试调用setSelectionIndex:时,它返回YES,表示选择已成功更改.但是,对pageArrayController对象的任何后续getSelectionIndex调用都返回NSNotFound.
我不明白的是,如果我将NSArrayController放入NIB,并允许NIB文件执行初始化(在Interface Builder中具有所有相同的属性),NSArrayController正常工作.
为什么行为存在差异?NIB文件是否以特殊方式初始化这些类型的对象?我的NSArrayController初始化是不正确的?
任何帮助表示赞赏.谢谢.
当我使用NSArrayControllerwith实例时NSManagedObject,我的印象是以下内容会给我选择的对象:
[myArrayController selection]
Run Code Online (Sandbox Code Playgroud)
但是,这给了我一些私有NS Proxy类的实例.
我用的时候:
[[myArrayController selectedObjects] objectAt: 0]
Run Code Online (Sandbox Code Playgroud)
......一切都很好,我有我的实例NSManagedObject.
我理解这些方法的必要性,因为你可能有可以进行多项选择的列表.我不明白为什么selection不给我这个例子NSManagedObject.
我有一个NSTableView的表列绑定到Interface Builder中的NSArrayController.数组控制器必须Shared User Defaults Controller为Content Array.我不得不选择Handles Content As Compound Value添加新对象.不幸的是,当我add:作为数组的对象时,这会禁用表行的突出显示.添加了对象,但表格行未突出显示,您必须双击您认为该行能够编辑它的位置.
我的目标是add:使用数组控制器连续到表视图; 然后,让该行自动突出显示并可供用户编辑.
NSArrayController的属性:

NSArrayController的绑定:

TableView列的绑定:

interface-builder nsuserdefaults nstableview nsarraycontroller cocoa-bindings