我創建了一個表格視圖作爲我學校的一個應用程序的一部分,它允許學生進入他們的作業,然後檢查它並使其消失,就像提醒應用程序一樣。我遇到的問題是,當我檢查一行以使其消失時,我從表中刪除該行,並使用其存儲所有HomeworkItem
s的數組中的數據從HomeworkItem
中刪除該行;但是,下次嘗試添加一行(通過單擊最後一行的緩衝區行)時,添加的新行與剛刪除的行相同,即使HomeworkItem
已從該行中刪除陣列。我記得讀過NSableViews嘗試重複使用行以提高內存效率,但我不明白爲什麼這行會掛在舊信息上。有人可以解釋爲什麼會發生這種情況,或者我可以如何解決它?NSTableView重複使用舊數據行
這裏是我的自定義代碼TableViewCell:
HomeworkTableViewCell.h:
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
#import "ClassViewController.h"
@class ClassViewController;
@class AppDelegate;
@interface HomeworkTableCellView : NSTableCellView
@property (weak) IBOutlet NSTextField *assignmentName;
@property (weak) IBOutlet NSDatePicker *dueDatePicker;
@property BOOL isCompleted;
@property NSInteger rowNumber;
@property (weak) AppDelegate *ad;
@property NSTableView *superTable;
@property ClassViewController *superCVC;
- (void)setSuperRow:(id)sender;
- (IBAction)completed:(id)sender;
- (IBAction)dateChanged:(id)sender;
@end
HomeworkTableViewCell.m:
#import "HomeworkTableCellView.h"
@implementation HomeworkTableCellView
- (id)initWithCoder:(NSCoder *)aDecoder{
// NSLog(@"I");//TEST
self = [super initWithCoder:aDecoder];
if (self) {
self.ad = [[NSApplication sharedApplication]delegate];
self.superTable = self.ad.classViewController.homeworkTable;
self.superCVC = self.ad.classViewController;
self.isCompleted = NO;
}
return self;
}
- (void)setSuperRow:(id)sender{
[self.superCVC updateRow:sender];
}
- (IBAction)completed:(id)sender{
self.isCompleted = !self.isCompleted;
[self.superCVC changeStateOfHomeworkItem:self];
[self.superCVC updateRow:sender];
}
- (IBAction)dateChanged:(id)sender{
[self.superCVC updateRow:sender];
[self.superCVC editDateOfHomeworkItem];
}
@end
這裏正在發生的問題的視頻的鏈接:http://youtu.be/Ot8w5oz8L-E
控制檯中的文本是在刪除一個對象之後,在家庭作業數組中表示什麼,所以很明顯,刪除的對象不再存在。
編輯: 這就是我想出了利用UASI的建議:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
HomeworkTableCellView *HTCV = [self.homeworkTable makeViewWithIdentifier:tableColumn.identifier owner:self];//maybe owner:nil
[HTCV.assignmentName setStringValue: @""];
[HTCV.dueDatePicker setDateValue: [[NSDate alloc]initWithString:@"1-1-1 0:0:0 +0000"]];//false date for testing
HTCV.isCompleted = NO;
[HTCV.checkBox setState:NSOffState];
[self updateTableView];
return HTCV;
}
- (void)updateTableView{
for (int i = 0; i < self.ad.currentSubject.homework.count; i++) {
HomeworkTableCellView *HTCV = [self.homeworkTable viewAtColumn:0 row:i makeIfNecessary:NO];
HomeworkItem *HI = [self.ad.currentSubject.homework objectAtIndex:i];
[HTCV.dueDatePicker setDateValue: HI.dueDate];
[HTCV.assignmentName setStringValue: HI.details];
}
}
該視頻似乎是私人的:/ – uasi
我的壞,現在公開! –
請注意,tableView:viewForTableColumn:row:是NSTableViewDelegate的一部分,而不是NSTableViewDataSource。因此,確保任何對象實現該方法是表視圖的代表(和數據源)。 – zpasternack