English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحقيق ميزة اختيار الصفحة المنفردة في UITableView في iOS

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

نحن نحاول تحقيق شكل مثل هذا. يبدو الآن أكثر جمالًا وقدرة على الاحترافية، أليس كذلك.

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

أولاً، يجب أن تقوم بإضافة UIImageView إلى خلية مخصصة الخاصة بك، لأنك بالتأكيد ستحتاج إلى صورة اختيار وعدم اختيار، لذا يستخدم هذا UIImageView للتبديل بين الصور.

@property(nonatomic,strong)UIImageView *seletImage;

ملاحظة: لماذا لم أستخدم الزر هنا؟ أعتقد أن الزر الذي يكون فقط دائرة صغيرة مثل هذه ليس من السهل النقر عليه. طريقتي الرئيسية تتعلق بتحقيق ذلك من خلال طريقة التمثيل الخاص بـ didSelectRowAtIndexPath في UITableView.

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

 //添加到cell上
[self.contentView addSubview:self.seletImage];
//初始化
-(UIImageView *)seletImage{
إذا (!(_seletImage)) {
  _seletImage = [[UIImageView alloc]init];
}
return _seletImage;
}
// موقع
[self.seletImage mas_makeConstraints:^(MASConstraintMaker *make) {
  @strongify(self);
  make.right.equalTo(self.contentView.mas_right).with.offset(-15);
  make.centerY.equalTo(self.self.contentView);
  make.height.mas_equalTo(22);
  make.width.mas_equalTo(22);
 };

ثم نحتاج أيضًا إلى ViewModel للخلية لسجل التغيرات المختلفة في الخلية، حيث نضيف معلمة لتحديد ما إذا كانت هذه الخلية قد تم النقر عليها.

@property(nonatomic) BOOL isSelected;

ثم عندما نعود إلى هذه الخلية، نحتاج إلى استخدام RAC لمراقبة تغييرات المعلمة isSelected، وتغيير الصورة

  [[[RACObserve(self.viewModel, isSelected) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread] subscribeNext:^(NSString *x){
  @strongify(self);
  if ([x boolValue]==YES) {
    [self.seletImage setImage:[UIImage imageNamed:@"alarmsetting_selected"]];
  } else {
    [self.seletImage setImage:[UIImage imageNamed:@"alarmsetting_notselected"]];
  }
};

حسنًا، الخطوة الأخيرة، دعونا نعود إلى ViewController هذا للخلية، ونقوم بالتعامل مع didSelectRowAtIndexPath.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  [tableView deselectRowAtIndexPath:indexPath animated:YES];
 // يتم استنساخ قائمة viewModel إذا كان سطر النقر يتطابق مع viewModel، يتم تغيير isSelected إلى Yes، وإلا يتم تغييره إلى No
  for (NSInteger i = 0; i<[self.viewModel.ItemArray count]; i++) {
    ItemViewModel *itemViewModel = self.viewModel.ItemArray[i];
    if (i != indexPath.row) {
      itemViewModel.isSelected = NO;
    } else if (i == indexPath.row) {
      itemViewModel.isSelected = YES;
    }
  }
  [self.tableView reloadData];
}

سأوضح ذلك ببساطة، لأن كل cell يحتوي على ViewModel مرتبط بها، ويتم وضع هذا ViewModel في قائمة ViewModel لـ ViewController. لذا، يتم التحقق من هذا، واستخراج ViewModel الذي يتطابق مع السطر المحدد للنقر، وتغيير المعلمات لتحقيق هذا التأثير.

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

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية حقوق النشر تخص المالك، المحتويات تم تقديمها من قبل مستخدمي الإنترنت بشكل تلقائي وتحميلها، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي ولا يتحمل المسؤولية القانونية المتعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وقدم الأدلة ذات الصلة، إذا تم التحقق من ذلك، فإن هذا الموقع سيرحل على الفور عن المحتويات المشبوهة.

أنت قد تعجبك