تحديث القاموس المنضم بناء على القيمة التي تم تحرير nstextfieldcell

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

سؤال

أنا أعمل على تنقل بعض الكود القديم (10.2 عصر) من الأرشفة القائمة على NSCODING / PLIST لاستخدام البيانات الأساسية. لدي nsoutlineView مع مخصص nstextfieldcell. يرتبط طريقة العرض المخطط التفصيلي إلى Nstreecontroller لتوفير البيانات.

يشبه نموذج الارتباطات مثل هذا:

Nstreecontroller: سياق كائن مدار -> Controller.managedobjectContext

NSOUTLINEVIEWOVEN VALLECOLUME NSTABLECOLUME -> تحكم الأشجار: TramptObjects: ItemDictionary

يحتوي NSOutLineView على فئة فرعية مخصصة NSTEXTFILDCELL تضيف صورة بجوار حقل النص، لذلك أقوم بتمرير قيم NSManagedObject إليها كمنظمة NSSHutabledictionary يسمى ItemDictionary حتى أتمكن من سحب وتعيين العنوان والقيم الرئيسية التي يتم إسقاطها.

حيث تقوم بتحديث قيمة حقل النص وإصدار القيمة التي تم تغييرها إلى مثيل كائناتي المدارة. بعد نقر المستخدم المزدوج على قيمة العنوان وتحريرها، يتم تمريرها -(id)objectValue, ، لكنني لست متأكدا من أن الخطوة التالية هي الحصول على تحديث تم نشره إلى مثيل NSManagedObject الخاص بي. الرمز الذي أقيمه حتى الآن للحصول على القيم ووضع القيم في الفئة الفرعية nstextfieldcell الخاصة بي:

- (void)setStringValue:(NSString *)aString {
  [super setObjectValue:aString];
}

- (void)setObjectValue:(id <NSCopying>)anObject {  
  id cellValues = anObject;

  [super setObjectValue:[cellValues valueForKey:@"title"]];
  [self setCheckState:[[cellValues valueForKey:@"isChecked"] integerValue]];
}

- (id)objectValue {
  return [super objectValue];
}
هل كانت مفيدة؟

المحلول

سألت حولها، وهذه هي التوصية التي أعطاني شخص ما؛ يبدو معقولا.

في الفئة الفرعية NSCell، في أي طريقة يتم استدعاءها بواسطة حلقة الحدث عند تحديد قيمة جديدة، قم بعمل شيء مثل هذا:

- (void)whateverMethodInCellSubclassIsTriggeredByEventLoop:(id)value {
    NSTableView *tableView = [self controlView];
    NSTableColumn *column = [[tableView tableColumns] objectAtIndex:[tableView editedColumn]];
    NSInteger rowIndex = [tableView editedRow];
    NSDictionary *bindingInfo = [column infoForBinding:NSValueBinding];
    id modelObject = nil;

    if ([controlView isKindOfClass:[NSOutlineView class]]) {
        NSTreeNode *item = [outlineView itemAtRow:rowIndex];
        modelObject = [item representedObject];
    } else if ([controlView isKindOfClass:[NSTableView class]]) {
        NSArrayController *controller = [bindingInfo objectForKey:NSObservedObjectKey];
        modelObject = [[controller arrangedObjects] objectAtIndex:rowIndex];
    }

    [modelObject setValue:value forKeyPath:[bindingInfo objectForKey:NSObservedKeyPathKey]];
}

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

نصائح أخرى

ربما أستقل ذلك بطريقة مختلفة، عن طريق تنفيذ outlineView:willDisplayCell:forTableColumn:item: طريقة المندوب، ووضع الممتلكات المتنقلة للخلية هناك، بدلا من داخل فئة Subclass الخلية. يمكنك بعد ذلك ربط هذا العمود مباشرة بالترتيب.، وبالتالي فإن آلية التحرير الافتراضية ستعتني بوضع خاصية على مثيل الكائنات المدارة.

IIRC، و item ستكون المعلمة التي تحصل عليها في الواقع مثيل nstreeenode ستمنحك خاصية تمثيلها مثيل NSManagedObject لهذا الصف، حتى تتمكن من الحصول على ما هي المعلومات التي تحتاج إليها بهذه الطريقة.

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