Pregunta

Anteriormente había publicado esta pregunta con un comentario en un hilo pensando que era simple.Que el hilo está aquí:

Cacao enlace a un artículo en particular en un controlador de matriz

Las preguntas se refiere a (y voy a más de describir aquí), un juego que estoy construyendo para intentar aprender objective-c y cocoa.Es suficiente pensar en él como el texas hold'em poker.Un servidor tiene la información de juego y gestiona la entrada de un número variable de clientes (siempre más de uno).A través de cacao enlaces, muestra a cada jugador de la información pública de el juego que se almacena en una matriz en el servidor utilizando un controlador de matriz en IB.Creo que de las cinco cartas de la mesa para ser almacenada en un NSArray en el servidor y se enlaza al contenido de un campo de una NSArrayController para cada cliente.

Esta parte funciona bien, como un encanto.Sin embargo, cada jugador tiene dos cartas que él necesita para mantener en privado.Cada cliente debe mostrar una tarjeta diferente dependiendo de lo que fue repartida a un jugador en particular.(Porque lo que realmente está sucediendo es que yo soy de la unión a una matriz de reproductor de objetos

NSArray * thePlayers, 

imagina que todas las tarjetas se almacenan en la misma matriz).Así que mi pregunta es, ¿cómo puedo configurar enlaces a un solo objeto de la controlador de matriz (o necesito algún otro controlador)?Es decir, ¿cómo puedo enlazar a un jugador de thePlayers matriz?'

¿Fue útil?

Solución

Sin embargo, cada jugador tiene dos cartas que él necesita para mantener en privado.Cada cliente debe mostrar una tarjeta diferente dependiendo de lo que fue repartida a un jugador en particular.(Porque lo que realmente está sucediendo es que yo soy de la unión a una matriz de reproductor de objetos ...

El cliente sabe que el jugador es que representa, a la derecha?No por índice—debería haber una referencia directa al Jugador del objeto para el jugador que se sienta en su teclado.Algo como MyPlayer *userPlayer;.Este es además el distribuidor objeto la celebración de una matriz de todos los jugadores, incluidos los que uno.

Una vez que haya permanecido fuera de esa manera, con el cliente controlador de tener una propiedad cuyo valor es el usuario el Jugador del objeto, la unión se convierte en simple:Te voy a enlazar la tarjeta de puntos de vista directamente a la tarjeta y la tarjeta B de la userPlayer propiedad del cliente controlador.(Esto es esencialmente lo que Chuck ya se ha sugerido en su respuesta, y lo que sugerí en mi comentario sobre tu respuesta en la otra pregunta.)

imagina que todas las tarjetas se almacenan en la misma matriz).

¿Por qué me quiero imaginar eso?¿Por qué no los jugadores poseen sus propias tarjetas por separado?

OK, entonces el distribuidor debe poseer todas las tarjetas (es decir, la cubierta).Se debe los co-propietarios de aquellos que se celebró también por un jugador.Los jugadores no tienen acceso a sus tarjetas a través del concesionario;cada jugador debe de mantener sus cartas.

Suena como que usted cometió el mismo error con tarjetas como con los jugadores:Pensar que un objeto se puede/debe conocer al otro a través de una matriz de índice.No se puede, ciertamente, no se si usted desea utilizar ese conocimiento con los Enlaces y no debería.El objeto que se necesita para conocer a la otra directamente.Esto no es sólo la solución correcta, que es la forma correcta de los objetos a conocer unos a otros.Cualquier matriz de índices de referencia de la base sería más complejo sin ningún beneficio.

Otros consejos

Se configura una propiedad en el controlador o modelo para acceder a ese jugador en particular y se unen a eso. No hay manera de unirse directamente a un objeto a un índice en particular en una matriz.

Si quiere unirse a los índices de matriz específicos, que podría podría crear una envoltura. Algo como esto. Se permite enlazar a item0, item1 y así sucesivamente. No hay ninguna comprobación de rango y se rompe si se cambia el tamaño de la matriz, pero se entiende la idea.

Interfaz

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

Implementación

#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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top