使用 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
语句中移动 privateCall
、mobileCall
和 workCall
。当只有一个与给定的水龙头相关时,无需计算所有三个。
真的最后,不要用String(describing:)
建URL。根据需要正确解包可选值。
我希望用户能够点击 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
语句中移动 privateCall
、mobileCall
和 workCall
。当只有一个与给定的水龙头相关时,无需计算所有三个。
真的最后,不要用String(describing:)
建URL。根据需要正确解包可选值。