كيف يمكن حفظ ولاية علامة اختيار في البيانات الأساسية؟

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

سؤال

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

UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

أرغب في الاستمرار في الشحتمات في الخلية بعد خروج المستخدم. لقد قمت بإنشاء سمة في كيائي يسمى "الشيكات" وأعطاها نوع المنطقي لكنني لا أعرف كيفية جعله أينما وصلت إلى صف ثم يظهر شيك وسريع. سيتم تقدير أي مساعدة إلى حد كبير. شكرًا

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

المحلول

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];


    if ([[selectedObject valueForKey:@"isDone"] boolValue]) {
        [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"isDone"];
    } else {
        [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isDone"];
    }
}

لدي بلدي UITableViewController وضع كما المندوب ل NSFetchedResultsController, ، لذلك سيؤدي التغييرات التي أجريتها إلى الكائنات المدارة في الاستعلام ^^^ إلى تشغيل الطرق التالية.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *defaultCellIdentifier = @"Item";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
    }

    NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    cell.textLabel.text = [item valueForKey:@"name"];

    if ([[item valueForKey:@"checks"] boolValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

إليك كيف العلاقات كل شيء معا

  1. ينقر المستخدم على صف
  2. Tableview: Didselectrow ... تقوم طريقة بتغيير خاصية "ISDone" للكائن المدار المناسب.
  3. إشعارات وحدة تحكم النتائج التي جلبت أن كائن مدار قد تغير ويستدعي controllerDidChangeContent طريقة على مندوبها.
  4. لي controllerDidChangeContent الطريقة فقط إعادة تحميل جميع البيانات في عرض الجدول
  5. عند إعادة تحميل TableView، My Tableview: Cellforrovor ... تقوم طريقة بتحقق من خاصية "ISDone" للعنصر المداري لمعرفة ما إذا كان يجب أن تحتوي الخلية على علامة اختيار أم لا.

وفقط حتى لا تشعر بالارتباك، استخدمت في البداية عام NSMangagedObject لتخزين حالة الصف، وهذا هو السبب في الطريقة الأولى التي نشرتها يقول، [selectedObject valueForKey:@"isDone"]. وبعد في وقت لاحق لقد تحولت إلى كائن مدار من الفئة الفئة المسماة JKItem, وهذا هو السبب في أن المجموعة الثانية من الطرق قادرة على استخدامها item.isDone دون توليد تحذير مترجم.

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