Почему я не вижу свои метки в симуляторе iPad, когда я использую точки останова во время отладки?

Когда я создаю и отлаживаю с точкой останова, установленной ВЕЗДЕ в коде, окно симулятора остается полностью черным, и я не вижу свою метку. Если я создаю и отлаживаю, не устанавливая никаких точек останова, я могу видеть свою метку. Кто-нибудь может помочь? Я хотел бы иметь возможность наблюдать за изменениями, происходящими с моими ярлыками, кнопками и т. Д., Когда я просматриваю строки в отладчике Xcode. Между прочим, моя программа использует код для динамического создания и размещения моего UILabel в основном представлении.

Могут ли все остальные видеть свои ярлыки и кнопки во время отладки с помощью точек останова? Я новичок в разработке iOS (4.2) и Objective-C.


person user651903    schedule 09.03.2011    source источник


Ответы (3)


Пока вы останавливаете выполнение с помощью точки останова, пользовательский интерфейс обновляться не будет. Таким образом, вы не можете отлаживать таким образом. Хотя вы сможете увидеть переменные и свойства. Например, в отладчике вы можете проверить, изменилось ли свойство text метки после того, как вы его установили, но пользовательский интерфейс не будет обновляться до тех пор, пока вы не продолжите выполнение.

person taskinoor    schedule 09.03.2011

Вам нужно будет опубликовать журнал выполнения, чтобы выяснить, почему ваш экран черный, когда вы устанавливаете точку останова. Я подозреваю, что вы устанавливаете точку останова перед циклом отрисовки, но ваш вопрос немного неясен по этому поводу.

Что касается вашей цели видеть изменения метки по мере прохождения кода, это предполагает неправильное понимание цикла рисования. По мере выполнения вашего кода он будет вносить изменения в структуры данных метки и, вероятно, вызывать вызов setNeedsDisplay: на метке (обычно это вызывается автоматически при необходимости). Когда произойдет следующий цикл рисования, виды, отмеченные для отображения, будут перерисованы. Это вызовет вызов drawRect:, но он по-прежнему не отображается на экране. Он просто втягивается в буфер. После выполнения всех drawRect: вызовов буфер будет синхронизирован с экраном.

В этом цикле нет смысла устанавливать точку останова для такого метода, как label.text = @"newstuff", и ожидать, что она появится на экране, когда вы переступите через нее.

person Rob Napier    schedule 09.03.2011
comment
Спасибо за информацию, ребята. Итак, если я не могу ожидать, что окно просмотра обновит визуальные изменения, когда я прохожу один шаг через отладчик, есть ли способ вставить вызов метода в код, где я могу инициировать фактическое визуальное обновление, или заставить этот вызов произойти когда я хочу? - person user651903; 09.03.2011
comment
Нет. Вы не контролируете обновления экрана. Все необходимые обновления в цикле событий перед отображением объединяются. Возможно, внесенное вами изменение будет отменено каким-либо другим изменением. Например, вы можете изменить метку, но затем метка может быть удалена с экрана или непрозрачный вид может скрыть ее. Система рисования оптимизирована, чтобы избежать ненужных шагов рисования / совмещения. Обход этого приведет к потере производительности при рисовании. - person Rob Napier; 09.03.2011
comment
Кстати, вот аналогичный вопрос по этому поводу: stackoverflow.com/questions/1503761/ - person Rob Napier; 09.03.2011

Убедитесь, что нажали маленькую стрелку «продолжить» после достижения точки останова (что может случаться неоднократно). Окно отладки Xcode имеет большую стрелку продолжения. Пока вы не нажмете «Продолжить», смоделированная ОС никогда не получит времени в цикле выполнения пользовательского интерфейса для обновления своего окна.

person hotpaw2    schedule 09.03.2011