Привязка какао к одному объекту из массива - PullRequest
1 голос
/ 19 января 2010

Ранее я публиковал этот вопрос в качестве комментария в связанной ветке, думая, что это просто. Эта тема находится здесь:

Привязка какао к определенному элементу в контроллере массива

Вопросы касаются (и я более подробно опишу это здесь) игры, которую я создаю, чтобы попытаться изучить цель-c и какао. Достаточно хорошо, чтобы думать об этом, как о Техасском Холдеме. Один сервер содержит игровую информацию и управляет вводом данных от переменного количества клиентов (всегда более одного). Посредством привязок какао он отображает каждому игроку общедоступную информацию об игре, которая хранится в массиве на сервере с использованием контроллера массива в IB. Подумайте о пяти карточках на столе, которые хранятся в NSArray на сервере и привязаны к полю содержимого NSArrayController для каждого клиента.

Эта часть отлично работает, как шарм. Тем не менее, у каждого игрока есть две карты, которые он должен держать в секрете. Каждый клиент должен показать свою карту в зависимости от того, что было роздано этому конкретному игроку. (Потому что на самом деле я привязываюсь к массиву объектов игрока

NSArray * thePlayers, 

представьте, что все карты хранятся в одном массиве). Итак, мой вопрос, как мне установить привязки к одному объекту из контроллера массива (или мне нужен какой-то другой контроллер)? То есть, как мне привязать к одному плееру массива PlaySlay? '

Ответы [ 3 ]

4 голосов
/ 19 января 2010

Вы устанавливаете свойство в контроллере или модели для доступа к этому конкретному игроку и привязки к нему. Не существует способа привязки непосредственно к объекту по определенному индексу в массиве.

2 голосов
/ 02 февраля 2011

Если вы хотите привязать к определенным индексам массива, вы можете создать объект-оболочку. Что-то вроде этого. Это позволяет вам связываться с item0, item1 и так далее. Проверка диапазона не выполняется, и она нарушается, если вы меняете размер массива, но вы поняли идею.

Интерфейс

@interface MyArrayBinder : NSObject {
    NSMutableArray *array;
}
- (id)initWithMutableArray:(NSMutableArray *)theArray;
- (NSMutableArray *)array;
@end

Осуществление

#include <objc/runtime.h>

static NSInteger _indexFromSelector(SEL sel) {
    return [[NSStringFromSelector(sel) stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]] integerValue];
}

static void _dynamicSetItem(MyArrayBinder *self, SEL sel, id obj) {
    [self.array replaceObjectAtIndex:_indexFromSelector(sel) withObject:obj];
}

static id _dynamicItem(MyArrayBinder *self, SEL sel)  {
    return [self.array objectAtIndex:_indexFromSelector(sel)];
}

@implementation MyArrayBinder

- (id)initWithMutableArray:(NSMutableArray *)theArray {
    self=[super init];
    if (self) {
        array=theArray;
        for(NSUInteger i=0; i<[array count]; i++) {
            class_addMethod([self class], NSSelectorFromString([NSString stringWithFormat:@"item%lu", i]), (IMP) _dynamicItem, "@@:");  
            class_addMethod([self class], NSSelectorFromString([NSString stringWithFormat:@"setItem%lu:", i]), (IMP) _dynamicSetItem, "v@:@");  
        }       
    }
    return self;
}

- (NSMutableArray *)array {
    return array;
}

@end
1 голос
/ 19 января 2010

Тем не менее, у каждого игрока есть две карты, которые ему нужно держать в секрете. Каждый клиент должен показать свою карту в зависимости от того, что было роздано этому конкретному игроку. (Потому что на самом деле я привязываюсь к массиву объектов игрока ...

Клиент знает, какого игрока он представляет, верно? Не по индексу - он должен иметь прямую ссылку на объект Player для игрока, сидящего за клавиатурой. Что-то вроде MyPlayer *userPlayer;. Это в дополнение к объекту дилера, содержащему массив всех игроков, включая этого.

После того, как вы разложите его таким образом, с клиентским контроллером, обладающим свойством, значением которого является объект Player пользователя, привязка становится простой: вы привязываете виды карт непосредственно к карте A и карте B из userPlayer свойство клиентского контроллера. (По сути, это то, что Чак уже предложил в своем ответе, и то, что я предложил в своем комментарии к вашему ответу на этот другой вопрос.)

представьте, что все карты хранятся в одном массиве).

Зачем мне это представлять? Почему игроки не владеют своими картами отдельно?

ОК, поэтому дилер должен владеть всеми картами (то есть колодой). Он должен совместно владеть теми, которые также находятся у игрока. Игроки не имеют доступа к своим картам через дилера; каждый игрок должен непосредственно держать свои карты.

Похоже, вы сделали ту же ошибку с картами, что и с игроками: думая, что один объект может / должен узнать другой через массив по индексу. Вы не можете - конечно, нет, если вы хотите использовать эти знания с Bindings - и не должны. Один объект должен знать другой напрямую . Это не только правильное решение, это правильный способ для объектов узнать друг друга. Любая ссылка на основе индекса массива была бы более сложной без какой-либо выгоды.

...