الأزرار والتسميات إعادة تعيين عند التمرير من خلال عرض المجموعة

0

لديّ طريقة عرض للمجموعات تمتلك فيها كل خلية القدرة على التفاعل مع المستخدم. كل خلية لها like زر و number of likes ضع الكلمة المناسبة. عند الضغط على الزر ، يجب أن يتحول الزر إلى سماوي ، ويجب زيادة التسمية (التي تحتوي على عدد الإعجابات). يعمل هذا الإعداد حاليًا. ومع ذلك ، عند التمرير خلال عرض المجموعة والتمرير مرة أخرى ، يعود الزر إلى لونه الأصلي (أبيض) ويتناقص التصنيف إلى قيمته الأصلية. لقد سمعت عن طريقة مفيدة ظاهريًا تسمى prepareForReuse() ، ولكن ربما لا أستخدمه بشكل صحيح. ها هو الكود الخاص بي:

هنا المصفوفة التي تحتوي على جميع الخلايا

var objects = [LikableObject]()

هذا هو تعريف الصنف لهذه الكائنات

class LikableObject {

  var numOfLikes: Int?
  var isLikedByUser: Bool?

  init(numOfLikes: Int, isLikedByUser: Bool) {
    self.numOfLikes    = numOfLikes
    self.isLikedByUser = isLikedByUser
  }
}

ضع في اعتبارك أن هناك المزيد من الوظائف الموجودة في هذا الكائن ، ولكنها غير ذات صلة لأغراض هذا السؤال. شيء واحد مهم يجب ملاحظته هو أن البيانات لكل خلية يتم التقاطها باستخدام واجهة برمجة التطبيقات. أستخدم Alamofire لتقديم طلبات إلى واجهة برمجة التطبيقات التي ستعيد المعلومات الخاصة بـ numOfLikes و isLikedByUser خصائص كل خلية.

إليك كيفية تحميل كل خلية باستخدام طريقة التفويض في طريقة عرض المجموعة:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ObjectCell", for: indexPath) as! ObjectCell
    cell.configureCell(
      isLikedByUser: objects[indexPath.row].isLikedByUser!,
      numOfLikes:    objects[indexPath.row].numOfLikes!,
    )
    return cell
  }

تحتوي فئة ObjectCell على الحقول الثلاثة التالية:

var isLikedByUser: Bool?
@IBOutlet weak var numOfLikes: UILabel!
@IBOutlet weak var likeBtn: UIButton!

وذلك configureCell() الطريقة ، التي تنتمي إلى فئة الخلايا ، هنا:

public func configureCell(numOfLikes: Int, isLikedByUser: Bool) {
    self.isLikedByUser   = isLikedByUser
    self.numOfLikes.text = String(numOfLikes)
    if isLikedByUser {
      self.likeBtn.setFATitleColor(color: UIColor.cyan, forState: .normal)
    } else {
      self.likeBtn.setFATitleColor(color: UIColor.white, forState: .normal)
    }
  }

واخيرا، prepareForReuse() الطريقة هنا:

override func prepareForReuse() {
    if isLikedByUser! {
      self.likeBtn.setTitleColor(UIColor.cyan, for: .normal)
    } else {
      self.likeBtn.setTitleColor(UIColor.white, for: .normal)
    }
  }

هذا لا يعمل. وحتى لو حدث ذلك ، ما زلت لا أعرف طريقة للحفاظ على numOfLikes تسمية من تناقص ، أو إذا كان ينبغي على أي حال. أفترض أن جزءًا كبيرًا من هذه المشكلة هو أنني لا أستخدم prepareForReuse() الطريقة بشكل صحيح ... ونقدر أي مساعدة ، شكرا لك.

3 الاجابة

1
افضل جواب

prepareForReuse ليس المكان المناسب لتعديل الخلية ، كما يذكر الاسم ، عليك "فقط" إعدادها لإعادة استخدامها. إذا قمت بتغيير شيء ما (على سبيل المثال isHidden خاصية عرض) ، ما عليك سوى تغييرها إلى الحالة الأولية.

ما يجب عليك فعله رغم ذلك ، يمكنك تنفيذه didSet إلى عن على isLikedByUser داخل الخلية ، وتطبيق التعديلات على likeBtn هناك. (هذا بالطبع الحل السريع)

الحل الطويل: إنه مضاد للنمط حيث تحتوي خليتك على خاصية مسماة isLikedByUser ، TableViewCell هو عرض وفي جميع البنى ، يجب أن تكون المشاهدات غبية قدر الإمكان حول منطق الأعمال. الطريقة الصحيحة هي تطبيق هذه التعديلات في طريقة تكوين الخلية التي يتم تنفيذها في ViewController.

إذا شعرت أنك ستعيد استخدام هذه الخلية كثيرًا في عناصر التحكم المختلفة ، فحدّدها على الأقل بواسطة بروتوكول وتحدث إلى خليتك من خلال هذا البروتوكول. بهذه الطريقة سيكون لديك رمز يمكن إعادة استخدامه وصيانته.

:مؤلف
0

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

class ObjectCell:UICollectionViewCell {

   var myObject:LikableObject!
}

في cellForRowAt

cell.myObject = objects[indexPath.row]

الآن داخل فئة الخلية المخصصة لديك الكائن يعكس أي تغيير عليه ، تأكد من أنه يمكنك استخدام التفويض / رد الاتصال أو أي تقنية ملاحظة

:مؤلف
0

ال prepareForResuse غير مطلوب هنا.

تحتاج إلى تحديث النموذج الكامن وراء معاينة الجدول. تتمثل إحدى طرق التحقق من ذلك في البيانات الوهمية التي تم الإعجاب بها مسبقًا ومعرفة ما إذا كانت هذه البيانات تُعرض بشكل صحيح.

:مؤلف
فوق
قائمة طعام