У меня есть UITableView со списком элементов. Выбор элемента подталкивает viewController, который затем выполняет следующие действия. из метода viewDidLoad Я запускаю URLRequest для данных, которые необходимы для моих подзонов - подкласс UIView с переопределением drawRect. Когда данные поступают из облака, я начинаю строить свою иерархию представлений. подкласс, о котором идет речь, передает данные, а метод drawRect теперь имеет все необходимое для визуализации.Какой самый надежный способ заставить UIView перерисовать?
Но.
Потому что я не называю drawRect явно - Cocoa-Touch ручками, что - у меня нет способа сообщить Cocoa-Touch, что я действительно очень хочу, чтобы этот подкласс UIView визуализировал. Когда? Теперь было бы хорошо!
Я пробовал [myView setNeedsDisplay]. Этот вид иногда работает. Очень пятнистый.
Я борюсь с этим часами и часами. Может кто-то, кто, пожалуйста, предоставит мне солидный, надежный подход к принудительному повторному рендерингу UIView.
Вот фрагмент кода, который подает данные в виде:
// 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
Роб, Вот мой контрольный список. 1) Есть ли у меня данные? Да. Я создаю представление в методе - hideSpinner - вызывает основной поток из connectionDidFinishLoading: таким образом: [self performSelectorOnMainThread: @selector (hideSpinner) withObject: nil waitUntilDone: NO]; 2) Мне не нужно рисовать мгновенно. Мне просто нужно это. Cегодня. В настоящее время это совершенно случайно, и я не в своем силе. [myView setNeedsDisplay] полностью ненадежна. Я даже зашел так далеко, чтобы вызвать [myView setNeedsDisplay] в viewDidAppear :. Nuthin. Какао просто игнорирует меня. Maddening !! – dugla
Глядя на ваш код, первое, что вы хотите убедиться, это то, что contatinerView сам на экране. Поместите в него что-то еще (например, UILabel) и посмотрите, не нарисовано ли это. Во-вторых, убедитесь, что self.containerView не равен нулю. Основной причиной «ничего не происходит» является отправка сообщения в ноль. Вам не нужно устанавливать setNeedsDisplay здесь, но если бы вы это сделали, было бы более типичным отправить его в containerView, а не в chromosomeBlockView. Вы просите контейнерView перерисовать себя и его подпрограммы (которые вы перегруппировали), одним из которых является chromosomeBlockView. –
Я обнаружил, что при таком подходе часто возникает задержка между 'setNeedsDisplay' и фактическим вызовом' drawRect: '. В то время как надежность вызова здесь, я бы не назвал это «самым надежным» решением - надежное решение для рисования должно теоретически делать весь чертеж непосредственно перед возвратом к клиентскому коду, требующему ничьей. –