البرمجة

تحسين أداء تحديث الوقت في تطبيق Swift

في هذا الكود، يبدو أن لديك صعوبة في تحديث قيمة الـ UILabel التي تعرض قيمة self.timer. لنبدأ بفحص الكود وتحديد المشكلات المحتملة ومن ثم اقتراح حلاً مناسباً.

أولًا، يُلاحظ أن لديك مصفوفة intArray تحتوي على أوقات محددة، ولكنك لم تحدد كيف تستخدمها بشكل صحيح لتحديد قيمة الـ UILabel. في دالة update(timer:)، يجب عليك استخدام الوقت المتبقي remain بدلاً من date_SSS في تحديث قيمة الـ UILabel.

لتحديث القيمة في الـ UILabel، يمكنك الوصول إليها بواسطة الـ IBOutlet الذي يرتبط بالواجهة الرسومية (Interface Builder)، أو يمكنك الوصول إليها مباشرة إذا كنت تقوم بإنشائها برمجياً. في هذا المثال، سأفترض أن لديك IBOutlet بالفعل للـ UILabel.

إليك تحديث للكود مع توضيحات:

swift
import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! // قم بربط هذا IBOutlet بـ UILabel في واجهتك الرسومية private var timer: Timer! let intArray: [String] = ["12:00:00", "12:50:00", "15:30:00", "16:40:00"] var currentIndex = 0 override func viewDidLoad() { super.viewDidLoad() let timeFormatter = DateFormatter() timeFormatter.dateFormat = "HH:mm:ss" self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update(_:)), userInfo: nil, repeats: true) // لديك فقط حاجة لإضافة Label مرة واحدة، ليس داخل الحلقة let labelFrame = CGRect(x: 50, y: 100, width: 150, height: 200) label = UILabel(frame: labelFrame) label.layer.cornerRadius = 20 view.addSubview(label) } func dateFromString(date: String) -> Date? { // يظل الكود كما هو } @objc func update(timer: Timer) { let timeFormatter = DateFormatter() timeFormatter.timeZone = TimeZone(identifier: "GMT") timeFormatter.dateFormat = "HH:mm:ss" let time = dateFromString(intArray[currentIndex]) let remain = time!.timeIntervalSince(Date()) let date_SSS = Date(timeIntervalSince1970: remain) // قم بتحديث قيمة الـ UILabel هنا label.text = timeFormatter.string(from: date_SSS) // اتبع أي منطق آخر تحتاجه، على سبيل المثال، تغيير الفهرس في المصفوفة currentIndex += 1 if currentIndex == intArray.count { currentIndex = 0 } } }

تأكد من ربط الـ IBOutlet الخاص بك مع الـ UILabel في واجهة المستخدم الرسومية. هذا التعديل يشمل أيضًا استخدام Timer بدلاً من NSTimer وتحسينات بسيطة في كود Swift.

المزيد من المعلومات

بالطبع، دعوني أوسع الشرح لتفهم أكثر حول التعديلات التي قمت بها في الكود.

  1. استخدام Timer بدلاً من NSTimer:
    في Swift 3 والإصدارات اللاحقة، تم استبدال NSTimer بـ Timer، وذلك للتوافق مع نظام النوافذ الزمنية الحديث. لذا قمت بتحديث الكود لاستخدام Timer بدلاً من NSTimer.

    swift
    self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update(_:)), userInfo: nil, repeats: true)
  2. استخدام DateFormatter بدلاً من NSDateFormatter:
    تم استبدال NSDateFormatter بـ DateFormatter، وهو جزء من تحسينات Swift 3. لذا، قمت بتحديث الكود لاستخدام DateFormatter.

    swift
    let timeFormatter = DateFormatter()
  3. تحديث ترتيب إضافة الـ UILabel:
    قمت بنقل إضافة الـ UILabel خارج الحلقة for loop لضمان أن يتم إضافتها مرة واحدة فقط. يجب أن يتم تحديد مكان إضافة العنصر داخل هيكل الواجهة مرة واحدة في دورة الحياة viewDidLoad.

    swift
    let labelFrame = CGRect(x: 50, y: 100, width: 150, height: 200) label = UILabel(frame: labelFrame) label.layer.cornerRadius = 20 view.addSubview(label)
  4. تحديث قيمة الـ UILabel داخل دالة update:
    قمت بتحديث قيمة الـ UILabel داخل دالة update ليتم عرض الوقت المتبقي date_SSS في الـ UILabel.

    swift
    label.text = timeFormatter.string(from: date_SSS)
  5. تحديث الفهرس في المصفوفة:
    قمت بإضافة كود لتحديث الفهرس في المصفوفة بحيث يتم التبديل بين الأوقات في intArray عند تحديث قيمة الـ UILabel.

    swift
    currentIndex += 1 if currentIndex == intArray.count { currentIndex = 0 }

هذه التعديلات يجب أن تساعدك في تحديث الـ UILabel بشكل صحيح بناءً على قيمة self.timer. لا تتردد في طرح المزيد من الأسئلة أو طلب توضيح إضافي.

زر الذهاب إلى الأعلى