Обновление: от ios10,
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
Из IOS 7и Позже UITextView
есть метод делегата:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
перехватывать переходы по ссылкам. И это лучший способ сделать это.
Для ios6и ранее хороший способ сделать это - создать подкласс UIApplication
и перезаписать-(BOOL)openURL:(NSURL *)url
@interface MyApplication : UIApplication {
}
@end
@implementation MyApplication
-(BOOL)openURL:(NSURL *)url{
if ([self.delegate openURL:url])
return YES;
else
return [super openURL:url];
}
@end
Вам нужно будет реализовать openURL:
в своем делегате.
Теперь, чтобы приложение запускалось с вашим новым подклассом UIApplication
, найдите файл main.m в своем проекте. В этом небольшом файле, который загружает ваше приложение, обычно есть такая строка:
int retVal = UIApplicationMain(argc, argv, nil, nil);
Третий параметр - это имя класса вашего приложения. Итак, заменив эту строку на:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
Это помогло мне.
UIApplication
и заменить реализацию openURL. Хотя таким образом сложно (но не невозможно) ссылаться на исходную реализацию.В iOS 7 или новее
Вы можете использовать следующий метод делегата UITextView:
Текстовое представление вызывает этот метод, если пользователь нажимает или удерживает URL-ссылку. Реализация этого метода не является обязательной. По умолчанию текстовое представление открывает приложение, отвечающее за обработку типа URL-адреса, и передает ему URL-адрес. Этот метод можно использовать для запуска альтернативного действия, такого как отображение веб-содержимого по URL-адресу в веб-представлении в текущем приложении.
Важный:
источник
UIWebView
если вы хотите сделать какой -либо другой текст ссылку , а не сам URL. В этом случае лучше всего использовать метку.<a>
Для Swift 3
или если цель> = IOS 10
источник
В Swift 5 и iOS 12 вы можете использовать один из трех следующих шаблонов для взаимодействия со ссылками в
UITextView
.№1. Использование
UITextView
«sdataDetectorTypes
собственности.Самый простой способ взаимодействия с телефонными номерами, URL-адресами или адресами в a
UITextView
- использоватьdataDetectorTypes
свойство. В приведенном ниже примере кода показано, как это реализовать. С этим кодом, когда пользователь нажимает на номер телефона, появляетсяUIAlertController
всплывающее окно.№2. Использование
UITextViewDelegate
«StextView(_:shouldInteractWith:in:interaction:)
методЕсли вы хотите выполнить какое-то настраиваемое действие вместо того, чтобы создавать
UIAlertController
всплывающее окно, когда вы нажимаете номер телефона во время использованияdataDetectorTypes
, вы должны обеспечитьUIViewController
соответствиеUITextViewDelegate
протоколу и реализоватьtextView(_:shouldInteractWith:in:interaction:)
. В приведенном ниже коде показано, как это реализовать:№3. Использование
NSAttributedString
иNSAttributedString.Key.link
В качестве альтернативы вы можете использовать
NSAttributedString
и установитьURL
для егоNSAttributedString.Key.link
атрибута. В приведенном ниже примере кода показана его возможная реализация. С помощью этого кода, когда пользователь нажимает на атрибутивную строку, появляетсяUIAlertController
всплывающее окно.источник
Быстрая версия:
Ваша стандартная настройка UITextView должна выглядеть примерно так, не забудьте делегат и dataDetectorTypes.
По окончании урока добавьте этот кусок:
источник
Swift 4:
1) Создайте следующий класс (подкласс UITextView):
2) Где бы вы ни настраивали текстовое представление, сделайте следующее:
Если вы используете раскадровку, убедитесь, что ваше текстовое представление в инспекторе идентичности правой панели выглядит так:
Вуаля! Теперь вы получаете переход по ссылке сразу, а не тогда, когда URL должен взаимодействовать с методом URL.
источник
Я сам этого не пробовал, но вы можете попробовать реализовать
application:handleOpenURL:
метод в делегате приложения - похоже, что весьopenURL
запрос проходит через этот обратный вызов.источник
Не уверен, как бы вы перехватили обнаруженный канал данных или какой тип функции вам нужно запустить. Но вы можете использовать метод didBeginEditing TextField для запуска теста / сканирования текстового поля, если вы знаете, что ищете… например, сравнение текстовых строк, соответствующих формату ### - ### - ####, или начните с www. чтобы захватить эти поля, но вам нужно будет написать небольшой код, чтобы обнюхать строку текстовых полей, повторно согласовать то, что вам нужно, а затем извлечь его для использования вашей функцией. Я не думаю, что это будет так сложно, если вы сузите именно то, что вы хотите, а затем сфокусируете свой оператор if () на фильтрах до очень конкретного шаблона соответствия того, что вам нужно.
Конечно, это означает, что пользователь коснется текстового поля, чтобы активировать didBeginEditing (). Если это не тот тип взаимодействия с пользователем, который вы искали, вы можете просто использовать триггер Timer, который запускается на ViewDidAppear () или другом в зависимости от необходимости и проходит через строку текстовых полей, а затем в конце вы запускаете строку текстового поля методы, которые вы создали, просто выключите таймер.
источник
application:handleOpenURL:
вызывается, когда другое приложение открывает ваше приложение, открывая URL-адрес со схемой, поддерживаемой вашим приложением. Он не вызывается, когда ваше приложение начинает открывать URL-адрес.Я думаю, что единственный способ сделать то, что хочет Владимир, - использовать UIWebView вместо UITextView. Сделайте свой контроллер представления реализацией UIWebViewDelegate, установите делегат UIWebView на контроллер представления и в реализации контроллера представления,
webView:shouldStartLoadWithRequest:navigationType:
чтобы он открывался[request URL]
в представлении вместо выхода из приложения и его открытия в Mobile Safari.источник