UITextView с интерактивной ссылкой или номером телефона и пользовательской строкой в ​​Swift - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над приложением для iOS. И в моем приложении я показываю детали продукта в UITextView. Данные могут содержать номер телефона, адрес электронной почты или ссылку на веб-сайт. Я могу сделать это кликабельным, используя свойства UITextViews. Также в моем UITextView я хочу добавить строку «Сроки и условия» в последнюю позицию, а когда нажимаю на нее, я хочу показать условия во всплывающем окне. Это также я сделал с NSAttributed String. Но проблема в том, что когда я щелкаю по URL-адресу, или по номеру телефона, или по моей собственной атрибутной строке, отображаются всплывающие термины. Как я могу дифференцировать свои клики, это означает, что если я нажимаю на веб-сайт, который должен открыться в браузере, или если это номер телефона, попросите меня позвонить на этот номер и, если это условия, откройте всплывающее окно. Пожалуйста, помогите мне. Я перепробовал все способы. Возможно ли это в iOS?
Вот мой код для добавления

let str = "\(offer_desc) t&c"  //t&c is the clickbale string added to the actaul offer description

let attributedString = NSMutableAttributedString(string: str, attributes: [NSAttributedStringKey.font: UIFont(name: "Avenir-Medium", size: 12)])

let foundRange = attributedString.mutableString.range(of: "t&c") 
attributedString.addAttribute(NSAttributedStringKey.link, value: "", range: foundRange)

descriptionTextView.linkTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue : UIColor.green]

descriptionTextView.attributedText = attributedString


func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

    self.showTermsCondition(self)
    return false
}

Когда я запускаю свое приложение. ссылка также отображается зеленым цветом, и при нажатии открывается всплывающее окно с условиями.

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Да, я исправил свою проблему. Что нам нужно сделать, это проверить URL в обратном вызове UITextView, как это.

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    if URL.absoluteString == ""  { //
       self.showTermsCondition(self)
       return false
    }

    return true //System will take care according to URL type, weblink, email or phone number
}

или вы также можете сделать это,

@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
}

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)

}
0 голосов
/ 05 мая 2019

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

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

...