迭代NSTableview或NSArrayController以获取数据

时间:2012-02-08 05:35:55

标签: macos cocoa core-data nstableview nsarraycontroller

我有一个绑定到NSArrayController的NSTableview。 Table / Arraycontroller包含核心数据“Person”实体。 GUI的用户将人员添加到NSTableview。

让我们说一个人实体看起来像

NSString* Name;
int Age;
NSString* HairColor;

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

所以我想做一些像

这样的事情
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的,所以我打开了垃圾收集

2 个答案:

答案 0 :(得分:3)

您正在寻找fast enumeration

对于您的示例,例如

for (PersonEntity *p in myNsArrayController.arrangedObjects)
{
    // Rest of your code
}

答案 1 :(得分:1)

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

[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,他们“一直”使用块。