سؤال

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

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

المحلول

على افتراض أنك لا تستخدم بيانات ربط الكاكاو / البيانات الأساسية، يمكنك عرض البيانات في NSTableView عن طريق تنفيذ طريقتين من nstableviewdatasource. بروتوكول. عادة ما تقوم وحدة التحكم الخاصة بك بتنفيذ البروتوكول، لذلك افتح ملف وحدة التحكم .M وإضافة هذه الطرق إلى وحدة التحكم @implementation:

- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
  return 25;  // fill this out
}

– (id) tableView:(NSTableView*)tableView
       objectValueForTableColumn:(NSTableColumn*)column
       row:(int)row {
  return row % 3 ? @"Tick..." : @"BOOM!";  // fill this out
}

تحتاج إلى تعيين الجدول dataSource الممتلكات إلى وحدة تحكم. في واجهة Builder التحكم في السحب من عرض الجدول إلى وحدة تحكم وتعيين dataSource. وبعد الآن بناء وتشغيل ويجب أن ترى بياناتك في الجدول.

إذا كنت ترغب فقط في ملء عمود واحد، أضف iBoutlet NstableColumn * إلى وحدة التحكم الخاصة بك؛ دعنا نسميها explosiveColumn. وبعد في واجهة Builder، اسحب التحكم من وحدة التحكم إلى العمود الذي تريد ملءه وتعيينه explosiveColumn. وبعد بعد ذلك، في الجدولفيو: ObjectValuefortableColumn: صف: يمكنك اختبار ما إذا كان column المعلمة هي نفس الكائن الذي يتم تعيينه للمخرج على:

– (id) tableView:(NSTableView*)tableView
       objectValueForTableColumn:(NSTableColumn*)column
       row:(int)row {
  if (column == explosiveColumn) {
    return row % 3 ? @"Tick..." : @"BOOM!";
  } else {
    // other columns blank for now
    return nil;
  }
}

قد يكون هذا البرنامج التعليمي مفيدا: http://www.cocoadev.com/index.pl؟nstableviewtorial.

نصائح أخرى

إليك مثالا باستخدام طرق عرض طاولة متعددة مع أساليب مصدر البيانات وتطبيق مستند المستند:

#pragma mark - Data Source Methods
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tv
{
    if (tv == racerTableView)
        return [racerList count];
    else if (tv == vehicleTableView)
        return [vehicleList count];
    else
        return 0; // something wrong here...
}

- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)col
        row:(NSInteger)rowi
{
    NSString *colid = [col identifier];
    if (tv == racerTableView){
        NHRacers *racer = [racerList objectAtIndex:rowi];
        return [racer valueForKey:colid];
    }
    else if (tv == vehicleTableView){
        NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
        return [vehicle valueForKey:colid];
    }
    else
        return 0; // something wrong here...
}

- (void)tableView:(NSTableView *)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn *)col row:(NSInteger)rowi
{
    NSString *colid = [col identifier];
    if (tv == racerTableView) {
        NHRacers *racer = [racerList objectAtIndex:rowi];
        [racer setValue:obj forKey:colid];
    }
    else if (tv == vehicleTableView){
        NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
        [vehicle setValue:obj forKey:colid];
    }
    else
        nil; // something wrong here...    
    [self updateChangeCount:NSChangeDone];
}

يتم تعيين منافذ TableView DataSource على مالك الملف وقم بتعيين مالك الملف vehicletableView و RacerTableView لمعرفة "عرض الجدول" الخاص بهم في IB. يتحقق مفتاح COLID معرف المعرف (تعيين في IB عن طريق تحديد عمود عرض الجدول أسفل "الهوية" المنسدلة، في حين يتم عرض "مفتش الهوية"). تم اختيار هذه القيم أن تكون خصائص KVC (ترميز المفاتيح المتوافقة مع الفئات المعروضة في الجدول المشاهدات: استخدم الحرف الأول الأحرف الأولى (انظر مستندات Apple Rest).

على سبيل المثال: (في nhvehicles.h)

@interface NHVehicles : NSObject
{
    NSUInteger entry;
    NSString *name;
    NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end

(في nhvehicles.m)

@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end

بالنسبة لهذا الجدول، سيتم كتابة "الإدخال"، "اسم" و "vehicleclass" (W / O ") في حقول المعرف لأعمدة كل منها.

إذا كنت لا ترغب في إظهار بعض البيانات في الفصل، فما عليك سوى عدم إدخال المفتاح لمعرف الأعمدة. كلمة تحذير: أنا أستخدم Xcode 4.5.1 ولاحظت أنه بمجرد إدخال عدد قليل من مفاتيح معرفات عمود معينة ثم غير رأيي حول وحاول مسح النص، فإنه اشتكى عندما حذف النص من حقل المعرف (لم يعد بإمكاني مغادرة الحقل فارغا للأعمدة التي قمت بتحريرها). لم يكن الأمر صعبا في العمل، لكنه كان مفاجئا.

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