使用UITapGestureRecognizer Swift从UILabel拨打电话号码

时间:2018-04-28 15:35:57

标签: ios swift uitapgesturerecognizer

我希望用户能够点按电话号码并直接拨打电话。我为每个人(私人,移动和工作)和3个不同的标签有3个不同的数字。 现在,如果我点击第一个或第二个标签没有任何反应,当我点击第三个标签(工作)时,它会调用第一个标签(私人)的动作。

所以我的第一个问题:我错误地认为它没有识别我点击的发件人?

第二个问题:我必须在函数didTapPhoneNumber中写一下if语句吗?

    phoneNumberPrivate2.isUserInteractionEnabled = true
    phoneNumberMobile2.isUserInteractionEnabled = true
    phoneNumberWork2.isUserInteractionEnabled = true

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.didTapPhoneNumber(_:)))
    tap.numberOfTapsRequired = 1
    tap.numberOfTouchesRequired = 1

    phoneNumberPrivate2.addGestureRecognizer(tap)
    phoneNumberMobile2.addGestureRecognizer(tap)
    phoneNumberWork2.addGestureRecognizer(tap)
}

//call me maybe
@objc func didTapPhoneNumber(_ sender: UITapGestureRecognizer) {
    print("success")

    let privateCall = phoneNumberPrivate2.text?.replacingOccurrences(of: " ", with: "", options: .literal, range: nil)
    let mobileCall = phoneNumberMobile2.text?.replacingOccurrences(of: " ", with: "", options: .literal, range: nil)
    let workCall = phoneNumberWork2.text?.replacingOccurrences(of: " ", with: "", options: .literal, range: nil)

    if sender == phoneNumberPrivate2 {
        print("you tapped label \(self.phoneNumberPrivate2)")
        if let url = URL(string: "tel://\(String(describing: privateCall))") {
            UIApplication.shared.openURL(url)
        }
    } else if sender == phoneNumberMobile2 {
        print("you tapped label \(self.phoneNumberMobile2)")
        if let url = URL(string: "tel://\(String(describing: mobileCall))") {
            UIApplication.shared.openURL(url)
        }
    } else if sender == phoneNumberWork2 {
        print("you tapped label \(self.phoneNumberWork2)")
        if let url = URL(string: "tel://\(String(describing: workCall))") {
            UIApplication.shared.openURL(url)
        }
    } else {
        print("action failed")
    }
}

1 个答案:

答案 0 :(得分:2)

首先,无法将手势识别器分配给多个视图。如果您尝试这样做,它将仅适用于您添加到的最后一个视图。您需要为每个标签创建一个独特的点按手势。他们每个人都可以使用相同的选择器。

接下来,您尝试将sender(手势)与每个标签进行比较。那不行。您需要将sender.view与每个标签进行比较。

最后,在每个相关的privateCall语句中移动mobileCallworkCallif。当只有一个与给定的水龙头相关时,无需计算所有三个。

真的最后,请勿使用String(describing:)来构建网址。根据需要正确展开可选值。