في هذا الكود، يبدو أن لديك صعوبة في تحديث قيمة الـ UILabel التي تعرض قيمة self.timer. لنبدأ بفحص الكود وتحديد المشكلات المحتملة ومن ثم اقتراح حلاً مناسباً.
أولًا، يُلاحظ أن لديك مصفوفة intArray
تحتوي على أوقات محددة، ولكنك لم تحدد كيف تستخدمها بشكل صحيح لتحديد قيمة الـ UILabel. في دالة update(timer:)
، يجب عليك استخدام الوقت المتبقي remain
بدلاً من date_SSS
في تحديث قيمة الـ UILabel.
لتحديث القيمة في الـ UILabel، يمكنك الوصول إليها بواسطة الـ IBOutlet الذي يرتبط بالواجهة الرسومية (Interface Builder)، أو يمكنك الوصول إليها مباشرة إذا كنت تقوم بإنشائها برمجياً. في هذا المثال، سأفترض أن لديك IBOutlet بالفعل للـ UILabel.
إليك تحديث للكود مع توضيحات:
swiftimport 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.
المزيد من المعلومات
بالطبع، دعوني أوسع الشرح لتفهم أكثر حول التعديلات التي قمت بها في الكود.
-
استخدام
Timer
بدلاً منNSTimer
:
في Swift 3 والإصدارات اللاحقة، تم استبدالNSTimer
بـTimer
، وذلك للتوافق مع نظام النوافذ الزمنية الحديث. لذا قمت بتحديث الكود لاستخدامTimer
بدلاً منNSTimer
.swiftself.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update(_:)), userInfo: nil, repeats: true)
-
استخدام
DateFormatter
بدلاً منNSDateFormatter
:
تم استبدالNSDateFormatter
بـDateFormatter
، وهو جزء من تحسينات Swift 3. لذا، قمت بتحديث الكود لاستخدامDateFormatter
.swiftlet timeFormatter = DateFormatter()
-
تحديث ترتيب إضافة الـ UILabel:
قمت بنقل إضافة الـ UILabel خارج الحلقةfor
loop لضمان أن يتم إضافتها مرة واحدة فقط. يجب أن يتم تحديد مكان إضافة العنصر داخل هيكل الواجهة مرة واحدة في دورة الحياةviewDidLoad
.swiftlet labelFrame = CGRect(x: 50, y: 100, width: 150, height: 200) label = UILabel(frame: labelFrame) label.layer.cornerRadius = 20 view.addSubview(label)
-
تحديث قيمة الـ UILabel داخل دالة
update
:
قمت بتحديث قيمة الـ UILabel داخل دالةupdate
ليتم عرض الوقت المتبقيdate_SSS
في الـ UILabel.swiftlabel.text = timeFormatter.string(from: date_SSS)
-
تحديث الفهرس في المصفوفة:
قمت بإضافة كود لتحديث الفهرس في المصفوفة بحيث يتم التبديل بين الأوقات فيintArray
عند تحديث قيمة الـ UILabel.swiftcurrentIndex += 1 if currentIndex == intArray.count { currentIndex = 0 }
هذه التعديلات يجب أن تساعدك في تحديث الـ UILabel بشكل صحيح بناءً على قيمة self.timer. لا تتردد في طرح المزيد من الأسئلة أو طلب توضيح إضافي.