gpt4 book ai didi

objective-c - NSTableView 重用旧数据行

转载 作者:行者123 更新时间:2023-12-03 16:51:16 25 4
gpt4 key购买 nike

我创建了一个表格 View 作为我学校应用程序的一部分,它允许学生输入他们的作业,然后将其勾掉并使其消失,就像提醒应用程序一样。我遇到的问题是,当我选中一行以使其消失时,我从表中删除该行,并删除 HomeworkItem 及其来自保存所有 的数组中的数据。家庭作业项目;但是,下次我尝试添加一行(通过单击末尾的缓冲区行)时,添加的新行与我刚刚删除的同一行,具有相同的 HomeworkItem 信息,即使该 HomeworkItem 已从数组中删除。我记得读过 NSableViews 尝试重用行以提高内存效率,但我不明白为什么该行卡在旧信息上。有人可以解释为什么会发生这种情况或者我该如何解决它吗?

这是我的自定义 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];
}
}

最佳答案

您可能不会使用-tableView:objectValueForTableColumn:row:制作表格单元格 View 。虽然该文档声称“此方法是强制性的”,但对该方法的评论可在 <AppKit/NSTableView.h> 中找到。说“此方法对于“基于单元格”的 TableView 是必需的,并且对于“基于 View ”的 TableView 来说是可选的。”

您可以使用 NSTableViewDelegate-tableView:viewForTableColumn:row:方法:

- (NSView *)tableView:(NSTableView *)tableView
viewForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row
{
// Instantiate a view object from XIB or reuse one in the cache.
NSString *identifier = @"YOUR_CELL_VIEW_IDENTIFIER";
HomeworkTableCellView *HTCV = [tableView makeViewWithIdentifier:identifier owner:nil];

#if 0
// If you have not put a HomeworkTableCellView object in a XIB with identifier,
// you'll need to create an instance programatically like this;
// It seems not to be the case, though.
if (HTCV == nil) {
HTCV = [[HomeworkTableCellView alloc] initWithFrame:NSZeroRect];
HTCV.identifier = identifier;
}
#endif

// Do initialization anything specific to a row here,
// because the view's -init{WithCoder:,WithFrame:} method
// is not always called for each row due to the cache mechanism.
HomeworkItem *HI = [self.homeworkArray objectAtIndex:row];
[HTCV.dueDatePicker setDateValue: HI.dueDate];
// ...

return HTCV;
}

关于objective-c - NSTableView 重用旧数据行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17417491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com