Добрый день! Возникла потребность в вызове из приложения. В табличке в одной из ячейки содержится номер, как сделать по нажатию на ячейку набор этого номера? Посоветуйте может где посмотреть.
Звонки из приложения
Нашел ответ!
func makeAPhoneCall() {
let url: NSURL = URL(string: “TEL://1234567890”)! as NSURL
UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
}
тогда другой вопрос, в таблице получается по нажатию на 5,6 и 9 строку должен быть вызов, но в функцию должен заносится номер из этой строки
как сделать?
func registerCell() {
let nib = UINib(nibName: cellId, bundle: nil)
tableView.register(nib, forCellReuseIdentifier: cellId)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Order.OrderTitle.allCases.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? OrderDetailCell else {
fatalError()
}
cell.backgroundColor = .clear
let orderTitle = Order.OrderTitle(rawValue: indexPath.row)!
let field = order.configureField(by: orderTitle)
cell.fill(with: field)
return cell
}
Можно делать вызов при нажатии на любую ячейку, но в самом методе проверять, может ли приложение открыть сформированный URL. Если может, значит там номер телефона.
Только это сработает в случае, если в других ячейках нету наборов цифр.
я так хотел, но в других ячейках цифры есть, и получается нужно конкретно на 5, 6 и 9 ячейку осуществлять вызов
У вас в вашей модели есть хоть какое-либо свойство, по которому можно определить что это номер телефона? Кроме самого номера
Либо, если вы на 100% уверены, что эти ячейки 5,6,9 будут всегда на своих местах, то можно просто проверку по индексу делать.
Главное фильтровать ненужные символы: так, например, из телефонной книги вставляется со всякими тире и скобками, а вызов идёт только по цифрам. Я использую вот такое расширение к стрингу:
extension String {
enum RegularExpressions: String {
case phone = "^\\s*(?:\\+?(\\d{1,3}))?([-. (]*(\\d{3})[-. )]*)?((\\d{3})[-. ]*(\\d{2,4})(?:[-.x ]*(\\d+))?)\\s*$"
}
func isValid(regex: RegularExpressions) -> Bool {
return isValid(regex: regex.rawValue)
}
func isValid(regex: String) -> Bool {
let matches = range(of: regex, options: .regularExpression)
return matches != nil
}
func onlyDigits() -> String {
let filtredUnicodeScalars = unicodeScalars.filter{CharacterSet.decimalDigits.contains($0)}
return String(String.UnicodeScalarView(filtredUnicodeScalars))
}
func makeACall() {
if isValid(regex: .phone) {
if let url = URL(string: "tel://\(self.onlyDigits())"), UIApplication.shared.canOpenURL(url) {
if #available(iOS 10, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
}
}
}
}
Далее по вызову makeACall
будет совершаться звонок, например: yourString.makeACall()
А как туда занести значение ячейки?
вот весь класс с таблицей
class OrderDetailViewController: UIViewController, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var order: Order!
let cellId = "OrderDetailCell"
override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
}
@IBAction func startProcessingOrder(_ sender: UIButton) {
performSegue(withIdentifier: "goToProcessingOrder", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? ChooseProcessingParamsViewController {
vc.order = self.order
}
}
func setupTableView() {
tableView.dataSource = self
registerCell()
}
func registerCell() {
let nib = UINib(nibName: cellId, bundle: nil)
tableView.register(nib, forCellReuseIdentifier: cellId)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Order.OrderTitle.allCases.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? OrderDetailCell else {
fatalError()
}
cell.backgroundColor = .clear
let orderTitle = Order.OrderTitle(rawValue: indexPath.row)!
let field = order.configureField(by: orderTitle)
cell.fill(with: field)
return cell
}
}
Тут никуда! Это расширение типа String
. Вы сами должны в своей логике по тапу на нужный объект получить String
с номером и потом к нему применить метод и всё. Я вам лишь подсказал как обработать стринг, чтобы убрать лишние символы, при наличии которых, UIApplication.shared.open(URL(string: "tel://..."))
провалится и всё упадёт.