1

API が提供する NSArray には、多数のコンテンツ オブジェクト (これを呼び出しますacquiredFruit) と、空の NSMutableArray が含まれてlikedFruitいます。

両方の配列に対して NSArrayControllers を作成し、TableView を にバインドしましたacquiredFruit.arrangedObjects。tableView の最初の列arrangedObjects.nameはすべてのおいしい果物にバインドされ、正しく表示されます。

likedFruitチェックボックスを含む 2 番目の列を作成しました。ユーザーがボックスに入力すると、配列に果物を追加したいと思います。ボックスのチェックを外すと、フルーツ オブジェクトがlikedFruit配列から削除されます。

基本的に、NSTableView を 2 つのアレイ コントローラー間で結合したいと考えています。このために単一の別のコントローラーを作成する必要があると感じていますが、問題へのアプローチ方法がわかりません。

また、配列を繰り返し処理して、必要なフィールドを持つ別のオブジェクトを構築できることは承知していますが、私の目標は、可能であればバインディングを使用してこれを行うことです。

考え?

4

2 に答える 2

3

アレイ コントローラを 1 つ使用する必要があると思います。

と呼ばれるフルーツの属性を持つことができますliked。これで、「いいね」チェックボックスの列が に接続されましたarrangedObjects.liked。後で、気に入ったすべての果物のセットを特定したい場合は、果物配列にクエリを実行できます。

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 を保持するための別の配列だけが必要です。果物の名前のキーと、チェックボックスがオンかどうかのブール値を持つ別のキーを持つ獲得済みフルーツ配列から辞書の配列を作成する必要があると思います。このブール値は2番目の列にバインドされます。likeFruit配列に新しい果物を追加する必要があることを伝える方法に関する次のステップについてはよくわかりません-チェックボックスには、likedFruit配列にオブジェクトを追加するために使用できるアクションメソッドを含めることができると思いますチェックボックスがクリックされた行。

編集後:

これが私が提案したことを行う方法の例です。果物の配列を取得し、チェック ボックスの値のキーを含む辞書の配列 (theData と呼ばれる) に変換します (IB では、配列コントローラーのコンテンツ配列は theData にバインドされ、列はにバインドされますArray Controller.arrangedObjects.fruitName および Array Controller.arrangedObjects.isLiked)。checkChanged はチェック ボックスに接続された IBAction であり (ただし、送信者は実際にはテーブル ビューであることに注意してください)、チェック ボックスの値を使用して、likedFruits に果物を追加するか削除するかを決定します。likeFruits の値を確認するためだけに、ボタンに接続されたもう 1 つのメソッドを配置します。

@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 に答える