Estoy tratando de subclase NSCell para su uso en un NSTableView. La celda que quiero crear es bastante complicado, por lo que sería muy útil si me podría diseño en la Interfaz del Generador y, a continuación, cargar el NSCell de una punta.

Es esto posible? ¿Cómo lo hago?

  • Ahora que NSTableView apoya NSTableCellView, me pregunto si hay una mejor manera de apoyar haciendo de todo, desde IB.
InformationsquelleAutor | 2008-10-14

10 Comentarios

  1. 11

    La pregunta era acerca de una subclase de NSCell; las otras respuestas parecen estar haciendo otra cosa, probablemente aprovechando UITableViewCell ser vista.

    NSCell no es una opinión. Mientras que la colocación de una celda personalizada en IB sería una cosa útil para ser capaz de hacer, creo que la respuesta es, básicamente, «no, esto no es posible». Cuando la subclase NSCell, que está bastante solo hacer su propio dibujo. No hay apoyo sub celdas, o con parámetros de diseño automático (ala NSView de muelles y amortiguadores), que sospecho que lo que usted está buscando.

    La única salvedad es que usted puede diseñar un NSCell subclase que hizo hacer el diseño de los sub-elementos y proporciona los parámetros para la configuración de los subelementos y todos serán ajustadas a los parámetros. Entonces, usted tendrá que escribir un IB plugin para hacer que la celda y el acompañamiento de inspector disponible en tiempo de diseño en IB.

    Esto, sin embargo, es probablemente más difícil que escribir una pequeña aplicación personalizada que hace más o menos lo mismo. Poner un NSCell en un control en el medio de una ventana, y se hace de interfaz de usuario para ajustar los parámetros de los que estás interesado. Los enlaces pueden hacer esto es bastante sencillo, para el posicionamiento de las cosas (es decir, se unen a un valor de x para un control deslizante), a pesar de que usted no va a obtener la manipulación directa de los elementos del curso. Cuando haya terminado, usted puede archivar su celular y carga el archivo en tiempo de ejecución en su aplicación real, o simplemente podría registro de las propiedades y los puso en el código de tu aplicación.

  2. 11

    Algunas respuestas en este hilo se han ido fuera de tema, porque estamos hablando de Cocoa Touch, cuando la pregunta original era acerca de Cacao – 2 Api son muy diferentes en este sentido y Cocoa Touch hace que sea fácil porque UITableViewCell es una vista de la subclase. NSCell no lo es, y ese es el problema

    Por la información, yo tenía que hacer algo muy similar en NSOutlineView recientemente – que es básicamente el mismo, pero un poco más difícil si nada, porque tienes que lidiar con la divulgación /colapso de los niveles. Si usted está interesado en el código, he publicado aquí: http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/

    HTH

    • exactamente lo que estaba buscando
  3. 7

    Como Ken dice, NSCells y NSViews son diferentes, y sólo se puede poner NSView jerarquías en PUNTA, no NSCells (que no tienen ninguna jerarquía explícita).

    Por otro lado, no hay nada que le impide tener una jerarquía de NSViews y usar eso para llamar su NSCell (se podría agregar como una subvista de su celda del padre de la vista, les digo a mostrar y quitar de la ventana y nadie iba a ser el más sabio.

    En este caso, el uso de una PUNTA iba a funcionar, a pesar de que parece un montón de problemas. Normalmente he sustituido el objeto que lleva NSCells con uno personalizado que lleva mi NSViews, pero que significa escribir su propio ratón-código de manipulación, que es muy delicado.

    Por otro lado, mi enfoque permite enlazar los puntos de vista de los valores en la PUNTA, así que usted no tiene que hacer ningún trabajo adicional, lo cual es genial.

  4. 5

    En IB, iniciar un vacío XIB. Ahora ve a la paleta y arrastre en una UITableViewCell, haga doble clic para abrir y editar.

    incluir sólo la costumbre UITableViewCell (ningún otro UIViews o de otras de nivel superior de los controles) – asegúrese de que es un verdadero UITableViewCell en IB, o no se puede establecer una reutilización identificador (en oposición a la fundición de una UIView en IB como su costumbre UITableViewCell clase).
    A continuación, puede agregar etiquetas o lo que quieras dentro de la célula, así como la configuración de la reutilización identificador o establecer cualquier divulgación indicador que te pueden gustar.

    Usar, te proporcionan un código como este en el formato tableview:cellForRow:atIndexPath: método:

    YourCustomCellClass *cell = (YourCustomCellClass *)[tableView dequeueReusableCellWithIdentifier:<IDYouSetInXIBFile>];
    if ( cell == nil )
    {
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:<YourXIBName> owner:self options:nil];
        id firstObject = [topLevelObjects objectAtIndex:0];
        if ( [ firstObject isKindOfClass:[UITableViewCell class]] )
            cell = firstObject; 
        else cell = [topLevelObjects objectAtIndex:1];
    }

    Si usted tiene cualquiera de las etiquetas u otros controles que desea para referencia en el código, alambre de ellos en IB a su celda personalizada de clase NO es el propietario del archivo, la cual no siempre se necesita ajustar usando el código de arriba (puedes dejarlo como NSObject).

    Edit: se me nota que usted está realmente en busca de un NSCell respuesta, pero el código de enfoque para el uso de IB deben ser idénticos en Cacao con la Cocoa Touch código que he usado anteriormente como loadNibNamed es un estándar de Cacao llamada.

    • De alguna manera me hizo mal el primer tiempo, pero tus instrucciones detalladas (el inicio) salvó el día. Thanx!
    • Tienes el mal OS aquí. No es Cocoa Touch.
  5. 2

    Joar Wingfors escribió un artículo para Paso a paso un par de años atrás en un tema relacionado, Subvistas en formato tableview Filas.

    La principal técnica es crear un NSCell que pueden alojar una NSView. Si usted fuera a hacer esto, usted podría diseñar un NSView subclase en el Interface Builder que se puede incrustar en cualquier lugar que usted necesita específica de la célula.

    Otra posibilidad, si se puede atacar de Leopardo, es para ver si usted necesita usar un NSTableView o si puede utilizar un NSCollectionView. Colección de vistas de tratar directamente en términos de «las vistas», en lugar de en las células, lo que es mucho más sencillo de diseñar en el Interface Builder.

  6. 1

    He encontrado algunos ejemplos interesantes que no estoy totalmente de entender, sin embargo.

    Los 2 últimos ejemplos de trabajo con NSTableViewDataSource y NSTableViewDelegate. Me gustaría usar Bindings un ArrayController en el InterfaceBuilder para conectar otros elementos de la interfaz como los campos de texto.

  7. 0

    Yo lo hago así:

    /* example of a silly way to load a UITableViewCell from a standalone nib */
    
    + (CEntryTableViewCell *)cell
    {
    //TODO -- this is really silly.
    NSArray *theObjects = [[NSBundle mainBundle] loadNibNamed:@"EntryTableViewCell" owner:self options:NULL];
    for (id theObject in theObjects)
        if ([theObject isKindOfClass:self])
            return(theObject);
    NSAssert(NO, @"Could not find object of class CEntryTableViewCell in nib");
    return(NULL);
    }

    Sin embargo no es muy eficiente y si está cargando gran cantidad de datos que podría hacerte daño. Por supuesto, usted debe utilizar un reuseIdentifier que debería obligar a que este código se ejecute sólo un puñado de veces por tabla.

    • La pregunta era para el Cacao no, Cocoa Touch
  8. 0

    1) Crear NSViewController TableViewCell.h

    2) Crear en TableViewCell.h algunos procedimientos como el

    -(void)setText:(NSString *)text image:(NSImage *)image

    3) En la clase Principal de la #import "TableViewCell.h"

    4) En la clase Principal en -(NSView *)tableView:viewForTableColumn:row: write:

    NSImage *img = //some image
    TableViewCell *cell = [[TableViewCell alloc] initWithWindowNibName:@"TableViewCell"];
    cell.view.init;
    [cell setText:@"some text" image:img];
    return cell;

    Espero que esto ayude =)

  9. 0

    Quiero dar un enfoque más moderno, aquí.

    Comenzando con iOS 5, UITableView tiene un método

    (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

    Una vez que usted haya registrado su PUNTA que contiene su celda, sólo tiene que utilizar

    - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

    para obtener una nueva celda. Si una celda está disponible para su reutilización, será devuelto, de lo contrario una nueva célula se crea automáticamente, y en ese caso, esto significa que cargan desde el archivo NIB.

  10. -1

    Agregar su UITableViewCell a su tableviewcontroller y declarar una IBOutlet propiedad:

    @interface KuguTableViewController : UITableViewController {
        IBOutlet UITableViewCell *customTypeCell;
    }
    
    @property (readonly)  UITableViewCell *customTypeCell;

    … entonces en cellForRowAtIndexPath sólo puede usar su celular y configurarlo para que sea reutilizado:

    static NSString *CellIdentifier = @"CustomCell"
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
            cell = customTypeCell;
            cell.reuseIdentifier = CellIdentifier;
    • Tienes el mal OS aquí.
    • no merece menos, aunque.

Dejar respuesta

Please enter your comment!
Please enter your name here