سؤال

لدي صغير NSTableView مع خانة الاختيار. كلما لم يتم التحقق من مربع الاختيار ، أريد واحدة من المجاور NSCellS لتكون رمادية ولا يمكن الوصول إليها.

ومع ذلك ، لا يمكنني معرفة كيفية معالجة خلية واحدة فقط. -dataCellForRow من NSTableColumn يغير دائمًا خلية القالب لعمود الجدول بأكمله.

كيف يمكنني الوصول إلى خلية واحدة؟

يحرر: أنا ملء عرض الجدول باستخدام NSTableViewDataSource بروتوكول.

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

المحلول

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

بدلاً من ذلك ، يمكنك إنشاء كائن وحدة تحكم يقوم بتنفيذ NSTableViewDatasource واختياريا NSTableViewDelegate بروتوكولات. ثم يرسل عرض الجدول رسائل مصدر البيانات إلى وحدة التحكم الخاصة بك وتوفر وحدة التحكم الخاصة بك البيانات المناسبة.

يمكنك السماح بالتحرير لكائن معروض في طريقة عرض الجدول عن طريق تنفيذ ‑tableView:setObjectValue:forTableColumn:row: طريقة مصدر البيانات. سيتم استدعاء هذه الطريقة على كائن وحدة التحكم الخاصة بك عندما ينقر المستخدم على مربع الاختيار. تقع على عاتق وحدة التحكم في تحديث النموذج بشكل مناسب.

عند تحديث النموذج ، يجب أن تخبر وحدة التحكم الخاصة بك طريقة عرض الجدول لإعادة التحميل. سيطلب عرض الجدول بعد ذلك وحدة التحكم الخاصة بك عن قيمة أي خلية تتطلب عرضًا باستخدام ‑tableView:objectValueForTableColumn:row: طريقة مصدر البيانات. سيشمل ذلك الخلية التي تحتاج إلى تعطيلها. تحتاج وحدة التحكم الخاصة بك إلى توفير القيمة المناسبة للخلية.

إذا كنت بحاجة إلى مزيد من التحكم في الخلية ، فيمكنك تنفيذ‑tableView:willDisplayCell:forTableColumn:row: طريقة تفويض. وهذا ما يسمى مباشرة قبل عرض الخلية ، ويمكنك تعديل الخلية بشكل مناسب.

مزيد من المعلومات حول استخدام مصادر البيانات في المستندات.

الخيار الآخر (بدلاً من استخدام مصدر بيانات) هو استخدام روابط الكاكاو و NSArrayController أن ترتبط بمجموعتك من كائنات النموذج. في هذه الحالة ، يمكنك ربط Enabled ربط عمود الجدول ببعض خاصية كائن النموذج الخاص بك يتحكم في حالة تمكين الخلية. تقع على عاتقك مسؤولية التأكد من أن حالة تلك الخاصية صحيحة.

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

نصائح أخرى

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

أحاول أن أتذكر واجهة المحرر الدقيقة ، وأنا لست بجوار جهاز Mac في المنزل ، لذلك لا أستطيع القيام بمشي تمامًا - آمل أن يوجهك هذا في الاتجاه الصحيح.

منذ الإصدار 10.7 ، هناك -viewAtColumn:row:makeIfNecessary: على NSTableView. لا تأخذ غالبية المعلومات التي وجدتها على الويب الأساليب الجديدة في الاعتبار ، لذلك هنا لجميع الآخرين الذين يبحثون عن إجابة على هذا السؤال.

من حدث الماوس إلى اختيار الخلية

أولاً ، أضف بروتوكولًا لوحدة التحكم الخاصة بك للتعامل مع اختيار الخلية من عرض الجدول ، مثل هذا:

@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end

ثم الفئة الفرعية NSTableView والتجاوز -mouseDown:

// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger selectedRowIndex = [self rowAtPoint:point];
    NSInteger selectedColumnIndex = [self columnAtPoint:point];

    if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
    {
        [self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
    }

    [super mouseDown:event];
}

بعد ذلك ، يمكنك استخدام -viewAtColumn:row:makeIfNecessary: مثل هذا في كائن مندوب/وحدة تحكم:

- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
    NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];

    // Do something with the cell to the right
    NSInteger nextColumn = column + 1;
    NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];

}

ملحوظة: في الوقت الحاضر ، قمت بتمرير طريقة عرض الجدول إلى المندوب كمعلمة بدلاً من الاعتماد على المندوب للحفاظ على إشارة إلى عرض الجدول.

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