زر لفتح جهات الاتصال

عبدالرحمن الخالدي • منذ 6 سنوات

السلام عليكم ورحمة الله وبركاته 

اخواني انا بغيت زر يفتح لي جهات الاتصال ( الأسماء )  و اذا اخترت اسم اي شخص من الاسماء ياخذ رقم الجوال و يتصل عليه .

طبعاً اللغة سويفت .

ويعطيكم العافية.

كلمات دليلية: c++ swift

الإجابة الصحيحة

Ahmed • منذ 6 سنوات
import UIKit
import ContactsUI


class ViewController: UIViewController, CNContactPickerDelegate {

    let contactPicker = CNContactPickerViewController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        contactPicker.delegate = self
    }
    
    @IBAction func contatcButtonClicked(_ sender: UIButton) {
        present(contactPicker, animated: true)
    }
    
    // Delegate's Methods
    
    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        contact.phoneNumbers.forEach { (contactValue) in
            let str = removeSpacesInNumbers(string: contactValue.value.stringValue)
            makeCall(str)
        }
    }
    
    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
        contactPicker.dismiss(animated: true, completion: nil)
    }

    func makeCall(_ string: String) {
        print(string)
        if string.isValid(regex: .phone) {
            if let url = URL(string: "tel://\(string)"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10, *) {
                    UIApplication.shared.open(url)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        } else {
            print(string)
        }
    }
    
    func removeSpacesInNumbers(string: String) -> String {
        var str = ""
        // Remove any spaces or any special characters.
        for char in string {
            if char == "+" || (char >= "0" && char <= "9") {
                str.append(char)
            }
        }
        return str
    }
}

extension String {
    // Regular Expressions works for this format:
    // 05xxxxxxxx(8)
    // +9665xxxxxxxx(8)
    enum RegularExpressions: String {
            case phone = "^\\+9665\\d{8}|05\\d{8}$"
    }
    
    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
    }
}

 

هذا كامل الكود 

الإجابات (6)

عبدالرحمن الخالدي • منذ 6 سنوات

هاذا الكود كامل في حين انا اجرب الأرقام على الايفون حقي

Ahmed: ممكن ترسل الأرقام ، لاني اختبرت ما يقارب ١٠ ارقام كلها نجحت ..

عبدالرحمن الخالدي: الاختبار اللي اختبرته على الايفون حقك ولا على الـSimulator

Ahmed: Unit Testing == XCTest

عبدالرحمن الخالدي: وش معناها هاذي اخوي او وش فايدتها و معليش والله تعبتك معي يالغالي

Ahmed: هذي مكتبة تستخدم للإختبار التطبيق ، انا استخدمت الـSimulator ، Unite Test ونجحت كل الإختبارات .. تأكد من الأكواد عندك !!

عبدالرحمن الخالدي • منذ 6 سنوات

كذا مضبوط ولا اخوي ؟خطا٤

Ahmed: صحيح ، كيف حافظ الأرقام في جوالك ؟ ٩٩٦٥xxxxxxx او تبدأ ب +

عبدالرحمن الخالدي: تبدأ ب +966 او الرقم مباشرة 05xxx

Ahmed: اذاََ الفورمات خطأ ، بعدلها واسوي لها اختبار واذا نجحت بعدل الإجابة

عبدالرحمن الخالدي: ممتاز ،انا بانتظارك ويعطيك العافية

Ahmed: يعافيك ، عدلت اجاتبي في الصفحة الآولى ، الآن راح يشتغل تمام ، جربته في جوالي والـ Unit Testing والـ Simulator. اذا اشتغل معاك ياليت تقبل الآجابة علشان نقفل النقاش في هذا السؤال (:

عبدالرحمن الخالدي • منذ 6 سنوات

ممكن تصحيح للخطا هاذا خييخطا٥

Ahmed: رقم ٧٩ و ٨١ ليش داخل الـمثد ؟ غير مكانهم داخل viewDidLoad

Ahmed: لحظة انزل كامل الكود

Ahmed • منذ 6 سنوات
الإجابة الصحيحة
import UIKit
import ContactsUI


class ViewController: UIViewController, CNContactPickerDelegate {

    let contactPicker = CNContactPickerViewController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        contactPicker.delegate = self
    }
    
    @IBAction func contatcButtonClicked(_ sender: UIButton) {
        present(contactPicker, animated: true)
    }
    
    // Delegate's Methods
    
    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        contact.phoneNumbers.forEach { (contactValue) in
            let str = removeSpacesInNumbers(string: contactValue.value.stringValue)
            makeCall(str)
        }
    }
    
    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
        contactPicker.dismiss(animated: true, completion: nil)
    }

    func makeCall(_ string: String) {
        print(string)
        if string.isValid(regex: .phone) {
            if let url = URL(string: "tel://\(string)"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10, *) {
                    UIApplication.shared.open(url)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        } else {
            print(string)
        }
    }
    
    func removeSpacesInNumbers(string: String) -> String {
        var str = ""
        // Remove any spaces or any special characters.
        for char in string {
            if char == "+" || (char >= "0" && char <= "9") {
                str.append(char)
            }
        }
        return str
    }
}

extension String {
    // Regular Expressions works for this format:
    // 05xxxxxxxx(8)
    // +9665xxxxxxxx(8)
    enum RegularExpressions: String {
            case phone = "^\\+9665\\d{8}|05\\d{8}$"
    }
    
    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
    }
}

 

هذا كامل الكود 

Ahmed: اذا نسخت هذا الكود ، تأكد ان الـ آبي اكشن يطابق الاسم اللي انت عرفته اللي هو tty ، انسخ هذا الكود وعدل اسم الابي اكشن فقط

عبدالرحمن الخالدي • منذ 6 سنوات

حبيبنا طلعت عندي مشكلة وبسيطه ان شاء الله وهي ان الارقام اللي مكتوبه بالارقام العربيه ماتشتغل معي بس الانقليزية مدري اذا لها حل هاذي المشكلة ياليت تعدلها في إجابتك.

ويعطيك العافية

Ahmed: اللي اعرفه ان الأرقام تلقائياََ تتحول للغة الآنقليزية ، تطبيق الفون ما يقبل ارقام غير الأنقليزية. بمكانك تسوي خوارزمية بسيطة للتحويل وتنحل المشكلة

عبدالرحمن الخالدي: كيف أسوي هاذي الخوارزمية اخوي.

Ahmed • منذ 6 سنوات
let numbers: [Character: String] = ["٠": "0", "١": "1", "٢": "2", "٣": "3","٤": "4",
                                    "٥": "5", "٦": "6", "٧": "7", "٨": "8", "٩": "9"]

func arabicToEnglish(arabicNumber: String) -> String {
    var englishNumber = ""
    for digit in arabicNumber {
        if let englishDigit = numbers[digit] {
            englishNumber += englishDigit
        }
    }
    return englishNumber
}

 

تفضل ، هذي خوارزمية بسيطة لتحويل الأرقام من اللغة العربية للغة الأنقليزية 

عبدالرحمن الخالدي: حلوين لكن هاذي احطها داخل الزر ولا برا

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !