遍历 NSTableview 或 NSArrayController 以获取数据

Posted

技术标签:

【中文标题】遍历 NSTableview 或 NSArrayController 以获取数据【英文标题】:Iterate over NSTableview or NSArrayController to get data 【发布时间】:2012-02-08 05:35:54 【问题描述】:

我有一个绑定到 NSArrayController 的 NSTableview。表/数组控制器包含核心数据“人”实体。这些人是由 GUI 的用户添加到 NSTableview 中的。

假设一个人实体看起来像

NSString* Name;
int Age;
NSString* HairColor;

现在我想遍历数组控制器中存储的内容以在其中执行一些操作。我想要做的实际操作并不重要我真的不想陷入我试图用这些信息做的事情。它只是对 NSArraycontroller 中的所有内容进行迭代,这让我感到困惑。我来自 C++ 和 C# 背景,是 Cocoa 的新手。假设我想在未来 1 年构建一个包含来自 nsarraycontroller 的每个人的 NSMutableArray。

所以我想做类似的事情

NSMutableArray* mutArray = [[NSMutableArray alloc] init];

foreach(PersonEntity p in myNsArrayController)  // foreach doesn't exist in obj-c


  Person* new_person = [[Person alloc] init];
  [new_person setName:p.name];
  [new_person setHairColor:p.HairColor];
  [new_person setAge:(p.age + 1)];
  [mutArray addObject:new_person];


我相信唯一阻止我做类似上面代码的事情是在 Obj-c 中不存在 foreach。我只是不明白如何迭代 nsarraycontroller。

注意:这是针对 OSX 的,所以我打开了垃圾收集

【问题讨论】:

【参考方案1】:

您正在寻找fast enumeration。

对于您的示例,类似

for (PersonEntity *p in myNsArrayController.arrangedObjects)

    // Rest of your code

【讨论】:

【参考方案2】:

您还可以使用块进行枚举。例如:

[myNsArrayController enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop)
 
       PersonEntity *p = object;
       // Rest of your code
 ];

这两种方法各有利弊。这些在这个问题的答案中进行了深入讨论:

Objective-C enumerateUsingBlock vs fast enumeration?

您可以在 Apple 的 WWDC 2010 视频中找到有关积木的精彩教程。他们说在 Apple,他们“一直”使用区块。

【讨论】:

以上是关于遍历 NSTableview 或 NSArrayController 以获取数据的主要内容,如果未能解决你的问题,请参考以下文章

根据表中的行数调整 NSTableView 或 NSScrollView 的大小

将分隔符颜色更改为背景或从NSTableView中删除它

懒惰地加载 NSTableView

NSTableView 在 NSSplitView 中显示不正确

取消选择 NSTableView 行时出现异常

保持 NSScrollView 固定