Pregunta

estoy creando un NSCell subclase que dibuja algunos objetos directamente en la vista (usando drawInRect:fromRect:operation:fraction:respectFlipped:hints:) y también dibuja un NSButton ejemplo simplemente usando NSView addSubview: selector.

Si bien los objetos dibujados con el primer método se dibujan correctamente, tengo problemas para dibujar el NSButton correctamente.El tema es que mi NSButton las instancias se dibujarán en los lugares correctos, pero varias veces.

He investigado esto en Internet por un tiempo y algunas personas sugirieron usar un caché, pero no estoy seguro de si es eficiente.(ir a una matriz que contiene botones usando un bucle for definitivamente causará un desplazamiento lento ya que muestro una gran cantidad de datos...)

¿Cómo harías esto?¿Estoy ladrando al árbol equivocado?

Este es el código relevante:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{    
    NSRect _controlRect = cellFrame;

    float _Y = cellFrame.origin.y;

    NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);

    _switch = [self _choiceSwitch];

    [_switch setFrame:_accessoryRect];
    [controlView addSubview:_switch];
}
¿Fue útil?

Solución

Larga historia corta: Los amigos no dejan que los amigos addSubview, mientras dibuja.

Esto es fundamental y no particularmente bien explicado aspecto de la gestión de interfaces de control, pero es importante entenderlo.

Deje que sus controladores dicten el "orden" de las subvistas y podrá dormir tranquilo sabiendo que ese botón no debe ser manipulado abiertamente (lo cual NO es el caso si está siendo empujado dentro de sus rutinas de dibujo personalizadas).

Es fácil quedar atrapado en este callejón. porque, como, oye, agregué un NSImageView en mi initWithFrame y todo parece estar bien… Pero es simplemente no es como se supone que debes hacerlo, supongo… y cuando empieces a subclasificar NSControl, etc.Es cuando empiezas a darte cuenta de por qué.

Actualizado: Aquí hay un muy buen artículo sobre el diseño de controles personalizados. con un igualmente un gran proyecto de muestra adjunto, que representa el tipo de organización del código que puede ayudar a evitar este tipo de problemas.Por ejemplo..Notarás en la clase de controlador cómo mantiene cada botón separado, único e independiente de los asuntos de otras vistas...

for (int butts = 0; butts < 3; butts++) {
    NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
    ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
    [mainView addSubview:butt];
}

enter image description here

Otros consejos

"Dibujo" NSButton agregar su instancia a la jerarquía de vistas cada vez que dibuje la celda es definitivamente una mala idea.En su lugar, cree un NSButtonCell y configúrelo a su gusto.Entonces, en tu -[NSCell drawInteriorWithFrame:inView:] use una celda ivar para dibujar su apariencia.

Si quieres tener un clic NSButton instancia en cada celda de la vista de tabla, intente evitar una llamada a addSubview: cuando sea posible.Cada vez que hace esto, la vista de control puede invalidar su diseño y volver a dibujar todo desde cero, creando algún tipo de recursividad en su caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top