حدثت مشكلة أثناء إنشاء قائمة التحقق (على غرار نموذج التعليمات البرمجية لـ TouchCells) لجهاز iPhone.يتم فحص الخلايا العشوائية

StackOverflow https://stackoverflow.com/questions/1619407

  •  06-07-2019
  •  | 
  •  

سؤال

لقد واجهت مشكلة في إنشاء قائمة مرجعية بأسلوب مثال TouchCells من نموذج التعليمات البرمجية لـ Apple.في الأساس، هو جدول يسمح بالاختيار المتعدد لعناصره ويعطي كل عنصر محدد علامة اختيار.

المشكلة التي أواجهها هي أنه عندما أقوم بتحديد عنصر ثم التمرير لأسفل الشاشة، سيتم تحديد عنصر آخر (خارج الشاشة) بشكل عشوائي.يبدو أنها عادة ما تكون الخلية التالية التي سيتم تحميلها على الشاشة.

لم أتمكن من معرفة الخطأ الذي كنت أفعله، لذا قمت باختباره باستخدام كود TouchCells الخاص بشركة Apple.لكن في برنامجهم، لديهم 6 خلايا فقط ولا يوجد مجال للتمرير.لذلك، قمت بتكرار بعض العناصر من ملف plist لإنشاء المزيد من الخلايا و...نفس المشكلة للملوثات العضوية الثابتة.إذا حددت خلية ثم قمت بالتمرير، فسيتم تحديد خلية أخرى بشكل عشوائي.

تحديث لقد قمت مؤخرًا بتجربة نموذج التعليمات البرمجية لـ iPhone Dev Cookbook المسمى "Checks" و...خمنت ذلك، نفس المشكلة.إليك الرابط: http://code.google.com/p/cookbooksamples/downloads/list

هذا يقودني للجنون.هل هو خطأ أم أفعل شيئًا خاطئًا؟هل يعرف اي احد كيفية اصلاح هذا؟

شكرًا!

أيضًا، هل يعرف أحد أي نموذج تعليمي يوضح كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

أواجه مشكلة مماثلة مع UITableViewCell المخصص في تطبيقي.وفقا لمستندات أبل على PreparForReuse:"يجب عليك فقط إعادة تعيين سمات الخلية التي لا تتعلق بالمحتوى، على سبيل المثال، ألفا، والتحرير، وحالة التحديد."

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

على سبيل المثال، لحل المشكلة في مثال TouchCells، استبدل:

static NSString *kCustomCellID = @"MyCellID";

مع:

NSString *kCustomCellID = [NSString stringWithFormat:@"MyCellID%d", indexPath.row];

أعتقد أن هذا أمر جيد إذا كان لديك عدد قليل من الخلايا، ولكن يجب أن تكون هناك طريقة أفضل، أليس كذلك؟

نصائح أخرى

من المحتمل أنك تفعل هذا:

if (whatever) {
  cell.accessoryType = UITableViewCellAccessoryCheckMark;
}

متى يجب عليك القيام بذلك:

if (whatever) {
  cell.accessoryType = UITableViewCellAccessoryCheckMark;
} else {
  cell.accessoryType = UITableViewCellAccessoryNone;
}

إذا كنت تستخدم خلية مخصصة، فيمكنك تجاوز PreparForeReuse:

- (void)prepareForReuse {
  [super prepareForReuse];
  self.accessoryType = UITableViewCellAccessoryNone;
}

وجدت الحل بعد بحث مؤلم في وقت متأخر من الليل...

في وظيفة checkAction في CustomCell.m (بالإشارة إلى مثال TouchCells)، استخدم setBackgroundImage بدلاً من setImage.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top