Отладка Xcode - отображение изображений


100

Мне нравится использовать отладчик Xcode. Вы можете взглянуть на значение переменной и даже изменить его.

Но могу ли я каким-то образом ОТОБРАЗИТЬ изображение, на которое ссылается переменная изображения? Я знаю, что могу видеть его необработанные байты, но было бы гораздо удобнее отображать окно с его содержимым.

Xcode может не поддерживать это. Может есть внешний инструмент, который помог бы отображать картинки?

Ответы:


273

Используйте Quick Look для проверки изображений в отладчике Xcode.

Выберите NSImageили UIImageв отладчике, затем щелкните значок «глаз» в Quick Look.

значок "глаз" на панели инструментов отладчика Xcode

Как и другие области OS X, вы также можете использовать spacebarQuick Look!

Просмотр UIImage в отладчике Xcode с помощью Quick Look

Quick Look в отладчике также может быть реализован для ваших собственных классов:

Включение быстрого поиска для пользовательских типов

Функция «Быстрый просмотр переменных» в отладчике Xcode позволяет получить быструю визуальную оценку состояния объектной переменной посредством графической визуализации, отображаемой в всплывающем окне либо в представлении переменных отладчика, либо в исходном коде.

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


13
Лучший. Характерная черта. Когда-либо!
Сев

2
Это самый ценный ответ года!
vedrano

8
Возраст программирования в Xcode, и я никогда не знал об этой функции! Это круто!!! Большое спасибо
Джоан Кардона

2
Знал об этой функции, но спасибо за подсказку пробела! Намного проще, чем щелкать мышью по глазам. :)
Chintan Patel

1
Работайте с Xcode 10 и Swift 4.2 как шарм. Спасибо.
атерешков 05

16

РЕДАКТИРОВАТЬ:

Начиная с Xcode 5, отладчик может показать вам визуальное представление переменных UIImage / CGImageRef!

Сам Xcode не может этого сделать. Я не знаю о внешних инструментах.

Что я делаю для тестирования изображений во время отладки, так это конвертирую эти необработанные данные в формат файла изображения, например .png, а затем сохраняю его где-нибудь, а затем открываю изображение с помощью любого инструмента просмотра изображений.

Для этой цели у меня есть фрагмент кода, который выглядит примерно так:

NSData *imageData = UIImagePNGRepresentation(self.myUIImage);
[imageData writeToURL:desktopURL atomically:YES];

И я просто копирую этот код туда, где хочу видеть содержимое изображения на ходу.

Обязательно избавьтесь от этого кода как можно скорее из-за высокой стоимости преобразования UIImageвNSData


2
просто любопытно: почему вы говорите «(и не должны) этого делать»? Было время, когда люди говорили, что компьютеры «не должны» иметь цветных экранов, поскольку они слишком дороги, или что текстовый редактор, используемый программистами, «не должен» проверять синтаксис вашего кода. неужели в какой-то момент нам действительно нужно отойти от архаичных идей?
несинхронизировано

Хорошо, поэтому я беру "не следует" обратно. Я хочу, чтобы однажды IDE интерпретировали изображения во время отладки.
Ави Шукрон,

Это отличная идея, и она мне помогла - спасибо. Вроде очевидный, когда кто-то указывает на это, но все же отличный указатель.
Скотт Литтл

@unsynchronized, посмотрите на это ... Xcode 5 может показывать изображения в отладчике ...
Ави Шукрон,

14

Редактировать для Xcode 5: теперь, когда вы наводите курсор на имя переменной изображения, справа появляется значок "глаз". Просто щелкните по нему, чтобы увидеть текущее изображение!

ПРИМЕЧАНИЕ: иногда это не удается в Xcode, даже если изображение правильное. Если это произойдет, ИЛИ если у вас нет переменной UIImage (например, это свойство другого объекта, вы все равно можете использовать более старый ответ:

Предыдущий ответ: начиная с ответа Авраама, я попробовал несколько экспериментов для отображения изображения iOS из lldb без необходимости перекомпилировать или добавлять его в представление. Я наконец придумал:

e [UIImagePNGRepresentation(myImage) writeToFile:@"/Users/<userName>/Desktop/myImage.png" atomically:NO];

Я сохраняю эту строку в текстовом редакторе и вставляю ее, когда мне это нужно. Это сохраняет текущее изображение, которое меня интересует (в данном случае "myImage"), в файл PNG на рабочем столе. Тогда я могу просто открыть этот файл с помощью Preview.

Если вы работаете на устройстве iOS, вы можете использовать

 e [UIImagePNGRepresentation(myImage) writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingString:@"/myImage.png"] atomically:NO];

Затем вы можете использовать Finder; выберите свое устройство; «Файлы»; затем ваше приложение для разработчиков и скопируйте изображение на рабочий стол, чтобы просмотреть его.


+1000000 Это потрясающее решение! Я хотел бы добавить, что если вы отлаживаете на устройстве, вы можете использовать что-то вроде iFunBox или iExplorer для получения изображения с устройства.
Квентин

Вы даже можете писать прямо в "/ Users / <ваше имя пользователя> /"; таким образом вам не придется искать свою временную папку через идентификаторы GUID
Дэнни П.

Хорошее предложение (обратите внимание, что вы должны использовать / Users / <your username> /, это не работает с ~ /). Соответственно обновил предложение.
mackworth

Замечательное предложение @mackworth. Спасибо.
arango_86

13

Если вы хотите работать с lldb консоли, используйте долото команду «Визуализация»

наконечник:

после установки вы можете установить условную точку останова после установки UIImage с действием: «визуализировать myUIImageToShowWithQuickLook»

введите описание изображения здесь

это покажет вам изображение автоматически, когда отладчик остановится.


4

Что делать, если вы не можете перейти к изображению через просмотр переменных?

Повторяя то, что сказал @pkamb - вы можете использовать представление переменных, чтобы быстро просмотреть изображение. Но что делать, если вы не можете добраться до изображения?

например у меня есть изображение на (contentViewController.view.subviews[0].subviews[1] as? UIImageView).image

но если я попытаюсь расширить contentViewControllerпредставление переменных, оно не покажет мои подпредставления

введите описание изображения здесь

что вы можете сделать, это щелкнуть правой кнопкой мыши, добавить выражение, и тогда вы сможете его увидеть!

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


Тогда вы сможете использовать ту же команду, что и выше: po [UIImagePNGRepresentation ((contentViewController.view.subviews [0] .subviews [1] as? UIImageView) .image) writeToFile: @ "/ Users / <userName> / Desktop /watchImage.png "атомарно: НЕТ];
Макворт

-7

Вы можете поставить точку останова в строке вашего изображения, а затем в отладчике просто напишите:

po your_UIImage_object

poозначает print object, это команда GDB, которая отобразит несколько полезных сведений о переданном объекте, в вашем случае об изображении.


1
Фактически, использование po с объектом UIImage напрямую выводит на консоль только адрес памяти имени класса экземпляра. Что-то вроде: <UIImage: 0x7fc98df6c7d0>
Дэниел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.