1

我有一个 API 为 NSArray 提供了一堆内容对象——我们称之为它acquiredFruit——还有一个空的 NSMutableArray,称为likedFruit.

我为这两个数组创建了 NSArrayControllers 并将我的 TableView 绑定到acquiredFruit.arrangedObjects. tableView 的第一列绑定arrangedObjects.name并正确显示了所有美味的水果。

我创建了带有复选框的第二列——当用户填写该框时,我想将水果添加到我的likedFruit数组中。取消选中该框应从likedFruit数组中删除水果对象。

本质上,我希望我的 NSTableView 加入两个数组控制器之间。我觉得我应该为此制作一个单独的控制器,但我不确定如何解决这个问题。

我还应该提到,我知道我可以遍历我的数组并使用我需要的字段构造另一个对象,但我的目标是尽可能使用绑定来做到这一点。

想法?

4

2 回答 2

3

我认为您应该使用一个阵列控制器。

您可以在 Fruit 上拥有一个名为 的属性liked。现在您的“喜欢”复选框列已连接到arrangedObjects.liked. 稍后,当您想确定所有喜欢的水果的集合时,您可以查询您的 fruits 数组:

NSArray * likedFruits = [ allFruitsArray filteredArrayUsingPredicate:[ NSPredicate predicateWithFormat:@"liked = YES"] ] ;

如果在 UI 的另一部分中只显示喜欢的水果,则可以将数组控制器的 filterPredicate 设置为上面的谓词以仅获取那些水果。

编辑:假设 NSFruit 是通过其他人的 API 提供的。让我们使用“向其他人的类添加属性的一般技术”:

@interface NSFruit (Liking)
@property ( nonatomic ) BOOL liked ;
@end

@implementation NSFruit (Liking)

-(BOOL)liked
{
    return [ objc_getAssociatedObject( self, "_abliked" ) boolValue ] ;
}

-(void)setLiked:(BOOL)b
{
    objc_setAssociatedObject( self, "_abliked", [ NSNumber numberWithBool:b ], OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}

@end

(我最近为大约 100 个帖子编写了相同的代码!)

于 2012-08-02T18:47:44.720 回答
1

我现在不在我的 Xcode 计算机上,所以我无法对此进行测试,但似乎你并不真的需要另一个阵列控制器,而只需要另一个阵列来保存 likeFruits。我认为您需要从您获取的Fruits 数组中创建一个字典数组,该数组将有一个用于水果名称的键和另一个带有布尔值的键,用于是否选中复选框-此布尔值将绑定到您的第二列。我不确定下一步如何告诉 likeFruit 数组它需要添加一个新水果——我认为该复选框可能有一个操作方法,您可以使用该方法让 likeFruit 数组将对象添加到单击复选框的行。

编辑后:

这是一个如何做我建议的例子。我将水果数组转换为字典数组(称为 theData),其中包含复选框值的键(在 IB 中,数组控制器的内容数组绑定到 theData,列绑定到数组 Controller.arrangedObjects.fruitName 和数组 Controller.arrangedObjects.isLiked)。checkChanged 是一个连接到复选框的 IBAction(但注意发送者实际上是表格视图),我使用复选框的值来确定是添加一个水果到 likeFruits 还是删除一个。我又添加了一个方法,连接到一个按钮,只是为了检查 likeFruits 中的值。

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.theData = [NSMutableArray array];
    self.likedFruit =[NSMutableArray array];
    NSArray *acquiredFruits = @[@"Apple",@"Orange",@"Pear",@"Peach"];
    for (NSString *aFruit in acquiredFruits) {
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:aFruit,@"fruitName",[NSNumber numberWithBool:NO],@"isLiked", nil];
        [self.theData addObject:[dict mutableCopy]];
    }
    self.theData = _theData;
   // NSLog(@"%@",self.theData);
}



-(IBAction)checkChanged:(NSTableView *)sender { //connected to the button cell in the table view (but sender is the table view)
    NSString *theFruit = [[self.controller.arrangedObjects objectAtIndex:sender.clickedRow ] valueForKey:@"fruitName"];
    BOOL doWeLikeIt = [[[self.controller.arrangedObjects objectAtIndex:sender.clickedRow] valueForKey:@"isLiked"] boolValue];
    if (doWeLikeIt) {
        [self.likedFruit addObject:theFruit];
    }else{
        [self.likedFruit removeObject:theFruit];
    }
}

-(IBAction)logLikedFruits:(id)sender {
     NSLog(@"%@",self.likedFruit);
}
于 2012-07-31T03:01:13.927 回答