UITableViewCell с выбираемым / копируемым текстом, который также обнаруживает URL-адреса на iPhone - PullRequest
1 голос
/ 25 марта 2010

У меня проблема. Часть моего приложения требует, чтобы текст отображался в таблице. Текст должен быть выбираемым / копируемым (но не редактируемым), а любые URL-адреса в тексте должны быть выделены, а при нажатии позволяют мне взять этот URL-адрес и открыть встроенный браузер.

Я видел пару решений, которые решают одну из этих проблем, но не обе.

Решение 1: Значок фабрики IFTweetLabel

Первым решением, которое я попробовал, было использование класса IFTweetLabel, созданного Icon Factory и использованного в Twitterrific.

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

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

Решение 2. Используйте IFTweetLabel и обрабатывайте копию вручную

Второе, что я попробовал, - это сохранить IFTweetLabel для обработки ссылок, но реализовать копирование с помощью жеста длинного нажатия, например, как это обрабатывает приложение SMS. Это просто работало, но не допускает произвольного выделения текста, копируется весь текст или вообще ничего не копируется ... Довольно черно-белое.

Решение 3: UITextView

Моя третья попытка была добавить UITextView в качестве подпредставления ячейки таблицы.

Единственное, что это не решает, - это то, что обнаруженные URL не могут быть обработаны мной. В текстовом представлении используется метод UIApplication openURL:, который закрывает мое приложение и запускает Safari.

Кроме того, поскольку табличное представление может стать довольно большим, количество UITextView s, добавленных в качестве подпредставлений, приводит к заметному снижению производительности при прокрутке по всей таблице, особенно на устройствах эпохи iPhone 3G (из-за создания, компоновки, компоновки всякий раз, когда ячейка прокручивается на экране и т. д.).

Итак, мой вопрос ко всем вам, знающим людям: «Что я могу сделать?»

Будет ли UIWebView лучшим вариантом? Помимо снижения производительности, я думаю, что веб-просмотр решит все вышеупомянутые проблемы, и, если я правильно помню, в течение 2,0 дней документация Apple фактически рекомендовала веб-просмотры, где требовалось форматирование текста / гиперссылки.

Кто-нибудь может придумать способ добиться этого без перетаскивания производительности?

Заранее большое спасибо всем, кто может помочь.

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Как только я нажал кнопку отправки, меня поразила новая идея.

Я был так озабочен тем, чтобы URL-адреса были встроены в текст и интерактив, поэтому я не подумал, что, возможно, это не лучшее решение.

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

Однако, возможно, лучше для взаимодействия с пользователем не выделять встроенные URL-адреса, а собирать их в массив за кулисами и представлять кнопку раскрытия как вспомогательное представление ячейки?

Затем для выделения и копирования текста я мог бы просто использовать UITextView с отключенными детекторами данных и не беспокоиться о том, что ссылки будут отправлены в safari и закрывают мое приложение.

При нажатии кнопки раскрытия пользователь может быть перенаправлен на URL-адрес, найденный в тексте, или, если найдено более одного URL-адреса, предоставить пользователю представление выбора, чтобы выбрать, к какому из них перейти.

Любые мысли / критика этой идеи приветствуются.

0 голосов
/ 25 марта 2010

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

Лучше задать вопрос: нужно ли отображать сам фактический URL? Можете ли вы обойтись только с именем страницы / местоположения, только префиксом server.host.domain или каким-либо другим сокращенным представлением URL? Я не думаю, что кто-то пытается прочитать длинный URL-адрес на ограниченном экране мобильного телефона.

Если вам нужно отобразить весь URL, то я думаю, что подробный вид - это путь.

...