How do I find the first URL in a UITextView?
I have a UITextView implemented as:
let textView = UITextView()
textView.isEditable = false
textView.dataDetectorTypes = .link
I know that setting the data detector type to link means that the text view will automatically find links, highlight them, and hyperlink them (make them tappable).
What I am trying to figure out is how to know whether or not the UITextView found at least one URL, and do something with that first URL programmatically. I've considered using regex to try to find common URL formats, but I'd like consistency with the way Apple does the detection.
Is there a way to extract the URL from attributedText, or is there an even simpler way to do it?
I think it could be done with something like this:
textView.attributedText.attribute(.link, at: 0, effectiveRange: 0..textView.text.count)
ios swift
add a comment |
I have a UITextView implemented as:
let textView = UITextView()
textView.isEditable = false
textView.dataDetectorTypes = .link
I know that setting the data detector type to link means that the text view will automatically find links, highlight them, and hyperlink them (make them tappable).
What I am trying to figure out is how to know whether or not the UITextView found at least one URL, and do something with that first URL programmatically. I've considered using regex to try to find common URL formats, but I'd like consistency with the way Apple does the detection.
Is there a way to extract the URL from attributedText, or is there an even simpler way to do it?
I think it could be done with something like this:
textView.attributedText.attribute(.link, at: 0, effectiveRange: 0..textView.text.count)
ios swift
add a comment |
I have a UITextView implemented as:
let textView = UITextView()
textView.isEditable = false
textView.dataDetectorTypes = .link
I know that setting the data detector type to link means that the text view will automatically find links, highlight them, and hyperlink them (make them tappable).
What I am trying to figure out is how to know whether or not the UITextView found at least one URL, and do something with that first URL programmatically. I've considered using regex to try to find common URL formats, but I'd like consistency with the way Apple does the detection.
Is there a way to extract the URL from attributedText, or is there an even simpler way to do it?
I think it could be done with something like this:
textView.attributedText.attribute(.link, at: 0, effectiveRange: 0..textView.text.count)
ios swift
I have a UITextView implemented as:
let textView = UITextView()
textView.isEditable = false
textView.dataDetectorTypes = .link
I know that setting the data detector type to link means that the text view will automatically find links, highlight them, and hyperlink them (make them tappable).
What I am trying to figure out is how to know whether or not the UITextView found at least one URL, and do something with that first URL programmatically. I've considered using regex to try to find common URL formats, but I'd like consistency with the way Apple does the detection.
Is there a way to extract the URL from attributedText, or is there an even simpler way to do it?
I think it could be done with something like this:
textView.attributedText.attribute(.link, at: 0, effectiveRange: 0..textView.text.count)
ios swift
ios swift
asked Nov 23 at 7:52
ChrisRockGM
132219
132219
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You can use NSDataDetector
like follows:
let text = "I usually search stuff on stackoverflow.com to find answers"
if let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) {
let matches = detector.matches(in: text, options: , range: NSRange(location: 0, length: text.utf16.count))
for match in matches {
guard let range = Range(match.range, in: text) else { continue }
let url = text[range]
print(url) // > stackoverflow.com
// Here is the place where you can count your URLs or do whatever you want with it
}
}
NB:
- Sample provided in Swift 4
- It might affect performance in case of long text
- This code wasn't tested with emoji and complex graphemes, so you should probably do it.
Read more in Official NSDataDetector
docs
My testing shows that this works withtext.count
instead oftext.utf16.count
. It works with emojis.
– ChrisRockGM
Nov 23 at 20:45
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53442609%2fhow-do-i-find-the-first-url-in-a-uitextview%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use NSDataDetector
like follows:
let text = "I usually search stuff on stackoverflow.com to find answers"
if let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) {
let matches = detector.matches(in: text, options: , range: NSRange(location: 0, length: text.utf16.count))
for match in matches {
guard let range = Range(match.range, in: text) else { continue }
let url = text[range]
print(url) // > stackoverflow.com
// Here is the place where you can count your URLs or do whatever you want with it
}
}
NB:
- Sample provided in Swift 4
- It might affect performance in case of long text
- This code wasn't tested with emoji and complex graphemes, so you should probably do it.
Read more in Official NSDataDetector
docs
My testing shows that this works withtext.count
instead oftext.utf16.count
. It works with emojis.
– ChrisRockGM
Nov 23 at 20:45
add a comment |
You can use NSDataDetector
like follows:
let text = "I usually search stuff on stackoverflow.com to find answers"
if let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) {
let matches = detector.matches(in: text, options: , range: NSRange(location: 0, length: text.utf16.count))
for match in matches {
guard let range = Range(match.range, in: text) else { continue }
let url = text[range]
print(url) // > stackoverflow.com
// Here is the place where you can count your URLs or do whatever you want with it
}
}
NB:
- Sample provided in Swift 4
- It might affect performance in case of long text
- This code wasn't tested with emoji and complex graphemes, so you should probably do it.
Read more in Official NSDataDetector
docs
My testing shows that this works withtext.count
instead oftext.utf16.count
. It works with emojis.
– ChrisRockGM
Nov 23 at 20:45
add a comment |
You can use NSDataDetector
like follows:
let text = "I usually search stuff on stackoverflow.com to find answers"
if let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) {
let matches = detector.matches(in: text, options: , range: NSRange(location: 0, length: text.utf16.count))
for match in matches {
guard let range = Range(match.range, in: text) else { continue }
let url = text[range]
print(url) // > stackoverflow.com
// Here is the place where you can count your URLs or do whatever you want with it
}
}
NB:
- Sample provided in Swift 4
- It might affect performance in case of long text
- This code wasn't tested with emoji and complex graphemes, so you should probably do it.
Read more in Official NSDataDetector
docs
You can use NSDataDetector
like follows:
let text = "I usually search stuff on stackoverflow.com to find answers"
if let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) {
let matches = detector.matches(in: text, options: , range: NSRange(location: 0, length: text.utf16.count))
for match in matches {
guard let range = Range(match.range, in: text) else { continue }
let url = text[range]
print(url) // > stackoverflow.com
// Here is the place where you can count your URLs or do whatever you want with it
}
}
NB:
- Sample provided in Swift 4
- It might affect performance in case of long text
- This code wasn't tested with emoji and complex graphemes, so you should probably do it.
Read more in Official NSDataDetector
docs
edited Nov 23 at 8:08
answered Nov 23 at 8:02
fewlinesofcode
2,024518
2,024518
My testing shows that this works withtext.count
instead oftext.utf16.count
. It works with emojis.
– ChrisRockGM
Nov 23 at 20:45
add a comment |
My testing shows that this works withtext.count
instead oftext.utf16.count
. It works with emojis.
– ChrisRockGM
Nov 23 at 20:45
My testing shows that this works with
text.count
instead of text.utf16.count
. It works with emojis.– ChrisRockGM
Nov 23 at 20:45
My testing shows that this works with
text.count
instead of text.utf16.count
. It works with emojis.– ChrisRockGM
Nov 23 at 20:45
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53442609%2fhow-do-i-find-the-first-url-in-a-uitextview%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown