J'ai un objet UITextView. Le texte dans UIView a un numéro de téléphone, un lien de courrier électronique, un lien de site Web. Je veux les montrer sous forme de liens avec les fonctionnalités suivantes.
Lorsque quelqu'un tape sur l'URL - Safari doit ouvrir le site Web .. Quand quelqu'un tape sur le lien de l'e-mail - Mail devrait s'ouvrir avec mon adresse dans le champ Quand quelqu'un tape sur le numéro de téléphone - L'application Téléphone doit appeler le numéro
Quelqu'un l'a-t-il déjà fait ou sait-il le gérer?
Merci, AJ
Si vous utilisez OS3.0
vous pouvez le faire comme suit
textview.editable = NO;
textview.dataDetectorTypes = UIDataDetectorTypeAll;
Remarque sur la détection des adresses électroniques: l'application Mail doit être installée (ce n'est pas sur le simulateur iOS) pour que les liens de messagerie ouvrent un écran de composition de message.
Bien que la question soit super vieille . Même si quelqu'un fait face au même problème,
En outre, il peut être utilisé comme un UILabel. Cependant, la solution ci-dessous fera l'affaire: [Il n'est pas nécessaire d'avoir une bibliothèque ..]}
Donc, j'ai utilisé MFMailcomposer () et UITexView[Le code est dans Swift 3.0 - Xcode 8.3.2]
Code de sécurité et de travail à 100% contre les collisions Prend en charge tous les cas difficiles. = D
Étape 1.
import MessageUI
Étape 2. Ajouter le délégué
class ViewController: UITextViewDelegate, MFMailComposeViewControllerDelegate{
Étape 3. Ajoutez le textView IBOutlet à partir de StoryBoard
@IBOutlet weak var infoTextView: UITextView!
Étape 4. Appelez la méthode ci-dessous dans votre viewDidload ()
func addInfoToTextView() {
let attributedString = NSMutableAttributedString(string: "For further info call us on : \(phoneNumber)\nor mail us at : \(email)")
attributedString.addAttribute(NSLinkAttributeName, value: "tel://", range: NSRange(location: 30, length: 10))
attributedString.addAttribute(NSLinkAttributeName, value: "mailto:", range: NSRange(location: 57, length: 18))
self.infoTextView.attributedText = attributedString
self.infoTextView.linkTextAttributes = [NSForegroundColorAttributeName:UIColor.blue, NSUnderlineStyleAttributeName:NSNumber(value: 0)]
self.infoTextView.textColor = .white
self.infoTextView.textAlignment = .center
self.infoTextView.isEditable = false
self.infoTextView.dataDetectorTypes = UIDataDetectorTypes.all
self.infoTextView.delegate = self
}
Étape 5. Implémenter des méthodes de délégation pour TextView
@available(iOS, deprecated: 10.0)
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange) -> Bool {
if (url.scheme?.contains("mailto"))! && characterRange.location > 55{
openMFMail()
}
if (url.scheme?.contains("tel"))! && (characterRange.location > 29 && characterRange.location < 39){
callNumber()
}
return false
}
//For iOS 10
@available(iOS 10.0, *)
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
if (url.scheme?.contains("mailto"))! && characterRange.location > 55{
openMFMail()
}
if (url.scheme?.contains("tel"))! && (characterRange.location > 29 && characterRange.location < 39){
callNumber()
}
return false
}
Étape 6. Écrire les méthodes d'assistance pour ouvrir MailComposer et Call App
func callNumber() {
if let phoneCallURL = URL(string: "tel://\(phoneNumber)")
{
let application:UIApplication = UIApplication.shared
if (application.canOpenURL(phoneCallURL))
{
let alert = UIAlertController(title: "Call", message: "\(phoneNumber)", preferredStyle: UIAlertControllerStyle.alert)
if #available(iOS 10.0, *)
{
alert.addAction(UIAlertAction(title: "Call", style: .cancel, handler: { (UIAlertAction) in
application.open(phoneCallURL, options: [:], completionHandler: nil)
}))
}
else
{
alert.addAction(UIAlertAction(title: "Call", style: .cancel, handler: { (UIAlertAction) in
application.openURL(phoneCallURL)
}))
}
alert.addAction(UIAlertAction(title: "cancel", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
else
{
self.showAlert("Couldn't", message: "Call, cannot open Phone Screen")
}
}
func openMFMail(){
let mailComposer = MFMailComposeViewController()
mailComposer.mailComposeDelegate = self
mailComposer.setToRecipients(["\(email)"])
mailComposer.setSubject("Subject..")
mailComposer.setMessageBody("Please share your problem.", isHTML: false)
present(mailComposer, animated: true, completion: nil)
}
Étape 7. Écrire la méthode de délégation de MFMailComposer
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
switch result {
case .cancelled:
print("Mail cancelled")
case .saved:
print("Mail saved")
case .sent:
print("Mail sent")
case .failed:
print("Mail sent failure: \(String(describing: error?.localizedDescription))")
default:
break
}
controller.dismiss(animated: true, completion: nil)
}
_ {C'est que tu es fait ... = D
Voici le fichier Swift pour le code ci-dessus: textViewWithEmailAndPhone.Swift
Définissez les propriétés ci-dessous pour l'utiliser comme un UILabel} _
Étape 1. Créez une sous-classe de UITextview et remplacez le canBecomeFirstResponder function
Code KDTextView.h:
@interface KDTextView : UITextView
@end
Code KDTextView.m:
#import "KDTextView.h"
// Textview to disable the selection options
@implementation KDTextView
- (BOOL)canBecomeFirstResponder {
return NO;
}
@end
Étape 2. Créez la vue texte à l'aide de la sous-classe KDTextView
KDTextView*_textView = [[KDTextView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[_textView setScrollEnabled:false];
[_textView setEditable:false];
_textView.delegate = self;
[_textView setDataDetectorTypes:UIDataDetectorTypeAll];
_textView.selectable = YES;
_textView.delaysContentTouches = NO;
_textView.userInteractionEnabled = YES;
[self.view addSubview:_textView];
Étape 3: Implémentez la méthode du délégué
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
{
return true;
}
Je suis curieux, avez-vous le contrôle du texte affiché? Si c'est le cas, vous devriez probablement le coller dans un UIWebView et y insérer des liens pour le faire "de la bonne manière".