gpt4 book ai didi

objective-c - 对多个 Core Data 实体重用 NSTableView 会导致越界错误

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

我有一个带有弹出按钮的窗口,允许用户选择核心数据实体和应显示有关实体信息的 TableView 。窗口 Controller 被设置为 TableView 的数据源和委托(delegate),并具有弹出按钮的操作方法。

TableView 的初始显示与弹出按钮中默认的实体配合良好。此默认(字符)实体在持久存储中拥有 30 个对象。第二个(创建者)实体有更多。

当从弹出菜单中选择 Creators 时,应用程序会出现以下错误:

** -[_PFArray objectAtIndex:]: index (30) beyond bounds (30)

这是似乎会导致相关方法崩溃的简化代码:

- (IBAction)listPopupButtonAction:(id)sender {
[[self nameOnlyTableView] reloadData];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
NSString *popupTitle = [[self listPopupButton] selectedItemTitle];
if ([popupTitle isEqualToString:@"Characters"]) {
return 30;
}
return 39;
}

- (NSView *)tableView:(NSTableView *)tableView
viewForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row {
NSString *popupTitle = [[self listPopupButton] selectedItemTitle];
NSString *name;
NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"nameOnly"
owner:self];

if ([popupTitle isEqualToString:@"Characters"]) {
NSArray *array = [CVCCharacter findAll];
CVCCharacter *character = [array objectAtIndex:row];
name = [character name];
} else {
name = @"name here";
}

[[cellView textField] setStringValue:name];
return cellView;
}

请注意,-numberOfRowsInTableView: 中的默认返回值非常具体。如果我将其设置为≤38,则不会崩溃,≥39,则崩溃。同样,Character 实体中正好有 30 个托管对象。

另请注意,当“Characters”为弹出按钮标题时,如果我手动设置 name 变量,则不会发生崩溃。

我的猜测是,当窗口加载时,“字符”用于数据源方法并且数据加载正确,但是当弹出窗口更改为返回明显多于默认实体的实体时,没有足够的出于某种原因要使用的行,并且此 _PFArray 仅在第二次使用现有行,因此它只有 30 行可供使用。但这并不能解释为什么只有在动态检索字符数据时才会发生崩溃。也许 -numberOfRowsInTableView 在弹出按钮标题完全设置之前被调用,但 -tableView:viewForTableColumn:row: 在设置后被调用,反之亦然? p>

那么,是否可以使用单个 TableView 来做到这一点?有什么建议吗?

最佳答案

您不应该从 tableView:viewForTableColumn:row: 填充您想要在 TableView 中显示的数据,这不仅在效率至上的方法中效率极低,因为它将作为用户为每一行调用滚动,但如果模型在 reloadData 和调用方法之间发生更改,它也会使您的代码崩溃。相反,您应该在调用 reloadData 之前设置模型并提取数据,以完全控制 TableView 应该显示的内容。

关于objective-c - 对多个 Core Data 实体重用 NSTableView 会导致越界错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20017618/

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