我很确定这很简单,但我仍然在学习。
我有一个连接到数组控制器的NSTableView来显示coredata对象。该表是不可编辑的。当选择单个记录时,我将子视图设置为可见,其中包含选择的值。
我试图做到这一点,当我在我的阵列控制器上按下连接添加的+按钮时,将创建一个新条目,焦点将跳转到子视图中的项目描述文本字段,当子视图出现时,用户可以无需选择新的arrangeObject行,然后选择文本字段,即可开始输入。
任何想法?
我会发布截图,但我还没有成为这里的用户。
答案 0 :(得分:4)
Big Nerd Ranch的Cocoa书(第4版)在第9章中有一个例子。它不使用NSArrayController的+ -add:方法作为+按钮,而是使用自定义方法创建对象,将其插入到数组中,处理正在进行的编辑和撤消管理器分组,最后选择所需的字段进行编辑。这是摘录:
- (IBAction)createEmployee:(id)sender
{
NSWindow *w = [tableView window];
// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
NSLog(@"Unable to end editing");
return; }
NSUndoManager *undo = [self undoManager];
// Has an edit occurred already in this event?
if ([undo groupingLevel] > 0) {
// Close the last group
[undo endUndoGrouping];
// Open a new group
[undo beginUndoGrouping];
}
// Create the object
Person *p = [employeeController newObject];
// Add it to the content array of ’employeeController’
[employeeController addObject:p];
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects];
// Get the sorted array
NSArray *a = [employeeController arrangedObjects];
// Find the object just added
NSUInteger row = [a indexOfObjectIdenticalTo:p];
NSLog(@"starting edit of %@ in row %lu", p, row);
// Begin the edit in the first column
[tableView editColumn:0
row:row
withEvent:nil
select:YES];
}
答案 1 :(得分:1)
是的,很简单:
请勿使用NSArrayController
。
只有在完全不需要任何控制的情况下,该课程才适用。如果需要控制,则应创建自己的控制器对象,该对象是表视图的数据源和委托,并具有NSFetchedResultsController以访问核心数据。
就我个人而言,我只使用NSArrayController
作为原型。一旦我开始认真对待应用程序,我总是将其抛弃,并将自定义的书面控制器放在其位置。