使用 UITapGestureRecognizer Swift 从 UILabel 调用一个 phone 数字

Call a phone number from a UILabel with UITapGestureRecognizer Swift

我希望用户能够点击 phone 号码并直接呼叫它。我为每个人(私人、移动和工作)分配了 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")
    }
}

首先,一个手势识别器不能分配给多个视图。如果您尝试这样做,它只会在您添加它的最后一个视图上起作用。您需要为每个标签创建一个独特的点击手势。他们每个人都可以使用相同的选择器。

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

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

真的最后,不要用String(describing:)建URL。根据需要正确解包可选值。