nstableview مع أعمدة متعددة
-
18-09-2019 - |
سؤال
ما هي طريقة سهلة لإعداد 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 ولاحظت أنه بمجرد إدخال عدد قليل من مفاتيح معرفات عمود معينة ثم غير رأيي حول وحاول مسح النص، فإنه اشتكى عندما حذف النص من حقل المعرف (لم يعد بإمكاني مغادرة الحقل فارغا للأعمدة التي قمت بتحريرها). لم يكن الأمر صعبا في العمل، لكنه كان مفاجئا.