Tengo una UITableView con una lista de elementos. Al seleccionar un elemento se presiona un control de vista que luego hace lo siguiente. del método viewDidLoad Apago una URLRequest para los datos requeridos por una de mis subvistas - una subclase de UIView con drawRect anulado. Cuando los datos llegan de la nube, empiezo a construir mi jerarquía de vistas. la subclase en cuestión pasa los datos y su método drawRect ahora tiene todo lo que necesita para renderizar.¿Cuál es la forma más sólida de forzar el redibujado de UIView?
Pero.
Porque no llamo a drawRect explícitamente - Cocoa-Touch maneja eso - No tengo manera de informarle a Cocoa-Touch que realmente, realmente quiero que se renderice esta subclase UIView. ¿Cuando? ¡Ahora estaría bien!
He intentado [myView setNeedsDisplay]. Esto a veces funciona. Muy irregular.
He estado luchando con esto durante horas y horas. ¿Podría alguien que por favor me brinde un enfoque sólido y garantizado para forzar una nueva versión de UIView?
Aquí es el fragmento de código que se alimenta de datos a la vista:
// Create the subview
self.chromosomeBlockView = [[[ChromosomeBlockView alloc] initWithFrame:frame] autorelease];
// Set some properties
self.chromosomeBlockView.sequenceString = self.sequenceString;
self.chromosomeBlockView.nucleotideBases = self.nucleotideLettersDictionary;
// Insert the view in the view hierarchy
[self.containerView addSubview:self.chromosomeBlockView];
[self.containerView bringSubviewToFront:self.chromosomeBlockView];
// A vain attempt to convince Cocoa-Touch that this view is worthy of being displayed ;-)
[self.chromosomeBlockView setNeedsDisplay];
Cheers, Doug
Rob, Aquí está mi lista de verificación. 1) ¿Tengo los datos? Sí. Creo la vista en un método - hideSpinner - llamado en el hilo principal de la conexiónDidFinishLoading: thusly: [self performSelectorOnMainThread: @selector (hideSpinner) withObject: nil waitUntilDone: NO]; 2) No necesito dibujar al instante. Solo lo necesito Hoy. Actualmente, es completamente aleatorio y está fuera de mi control. [myView setNeedsDisplay] no es confiable. Incluso he llegado a llamar a [myView setNeedsDisplay] en viewDidAppear :. Nuthin '. Cocoa simplemente me ignora. Maddening !! – dugla
Al mirar tu código, lo primero que debes asegurarte es que contatinerView esté en la pantalla. Ponga algo más en él (un UILabel por ejemplo) y vea si eso funciona. En segundo lugar, asegúrese de que self.containerView no sea nulo. Una causa principal de "no pasa nada" es enviar un mensaje a cero. No debería necesitar un setNeedsDisplay aquí, pero si lo hiciera sería más típico enviarlo a containerView en lugar de a chromosomeBlockView. Le está pidiendo al contenedorView que se rediseñe a sí mismo y sus subvistas (que ha reorganizado), una de las cuales es chromosomeBlockView. –
He descubierto que con este enfoque a menudo hay un retraso entre 'setNeedsDisplay' y la llamada real de' drawRect: '. Si bien la confiabilidad de las llamadas está aquí, no llamaría a esto la solución "más robusta": una solución de dibujo sólida debería, en teoría, hacer todo el diseño inmediatamente antes de volver al código del cliente que exige el sorteo. –