В Swift 3 и i0S 10 самый простой способ взаимодействия с телефонными номерами, URL-адресами или адресами в UITextView
- это использовать UIDataDetectorTypes
. Приведенный ниже код показывает, как отобразить номер телефона в UITextView
, чтобы пользователь мог взаимодействовать с ним.
import UIKit
class ViewController: UIViewController {
// Link this outlet to a UITextView in your Storyboard
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.text = "+33687654321"
textView.isUserInteractionEnabled = true // default: true
textView.isEditable = false // default: true
textView.isSelectable = true // default: true
textView.dataDetectorTypes = [.phoneNumber]
}
}
С этим кодом при нажатии на номер телефона всплывает UIAlertController
.
В качестве альтернативы вы можете использовать NSAttributedString
:
import UIKit
class ViewController: UIViewController {
// Link this outlet to a UITextView in your Storyboard
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
let phoneUrl = NSURL(string: "tel:+33687654321")! // "telprompt://+33687654321" also works
let attributes = [NSLinkAttributeName: phoneUrl]
let attributedString = NSAttributedString(string: "phone number", attributes: attributes)
textView.attributedText = attributedString
textView.isUserInteractionEnabled = true // default: true
textView.isEditable = false // default: true
textView.isSelectable = true // default: true
}
}
С этим кодом, при нажатии на приписанную строку, появится UIAlertController
.
Однако вы можете захотеть выполнить какое-то пользовательское действие вместо всплывающего UIAlertController
при нажатии на номер телефона. Или вы можете оставить UIAlertController
для всплывающего окна и одновременно выполнять свои собственные действия.
В обоих случаях вам придется настроить UIViewController
на соответствие протоколу UITextViewDelegate
и внедрить textView(_:shouldInteractWith:in:interaction:)
. Код ниже показывает, как это сделать.
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
// Link this outlet to a UITextView in your Storyboard
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.delegate = self
textView.text = "+33687654321"
textView.isUserInteractionEnabled = true
textView.isEditable = false
textView.isSelectable = true
textView.dataDetectorTypes = [.phoneNumber]
}
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
/* perform your own custom actions here */
print(URL)
return false // return true if you still want UIAlertController to pop up
}
}
С помощью этого кода при нажатии на номер телефона не будет отображаться UIAlertController
, и вы получите вместо этого следующую консоль в консоли:
тел: + 33687654321