gpt4 book ai didi

cocoa - 以编程方式绑定(bind) NSTableView

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

我试图更好地理解 cocoa 绑定(bind)。我可以在 IB 构建器中使用 NSArrayController 获得一个基本表。我正在使用相同的项目并尝试以编程方式连接绑定(bind),但是没有出现任何行。

这是我的头文件

@interface SBGoalDetailController : NSViewController <NSTableViewDelegate, NSTableViewDataSource>

@property (nonatomic, strong) NSManagedObjectContext *gdcManagedObjectContext;
@property (nonatomic, strong) NSArrayController *accountArrayController;
@property (weak) IBOutlet NSTableView *accountTable;


- (id)initWithContext:(NSManagedObjectContext *)context;

还有我的实现文件

@implementation SBGoalDetailController

- (id)initWithContext:(NSManagedObjectContext *)context
{
self = [super initWithNibName:@"GoalDetailView" bundle:nil];
if (self) {
[self setGdcManagedObjectContext:context];
}
return self;
}



- (void)awakeFromNib
{
_accountArrayController = [[NSArrayController alloc] init];

[[self accountArrayController] setManagedObjectContext:_gdcManagedObjectContext];
[[self accountArrayController] setEntityName:@"Account"];
[[self accountArrayController] setAutomaticallyPreparesContent:YES];
[[self accountTable] bind:@"content" toObject:_accountArrayController withKeyPath:@"arrangedObjects" options:nil];

[[self accountTable] bind:@"selectionIndexes" toObject:_accountArrayController withKeyPath:@"selectionIndexes" options:nil];
}


- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{

NSView *returnView = [tableView makeViewWithIdentifier:@"AccountCell" owner:[tableView delegate]];

NSTextField* textField = [[returnView subviews] objectAtIndex: 0];

[textField bind: NSValueBinding
toObject: returnView
withKeyPath: @"objectValue.accountName"
options: nil];

return returnView;
}

对我缺少哪一步有什么建议吗?

最佳答案

先做简单的事情:确保 -awakeFromNib 被调用一次,并且 _gdcManagedObjectContextaccountTable 此时不为零.

尝试向 View 中添加静态标签或背景颜色,以便确认问题是没有行(相对于行包含不可见内容)。 p>

当您确认问题不在于行时,您可以断定-awakeFromNib中存在问题。尝试添加阵列 Controller 的 arrangedObjects 的打印输出。大概是空的吧理论上,您在 -tableView:viewForTableColumn:row 中的代码尚未被调用。您可以使用断点或 NSLog 来确认。

如果是这种情况,请检查您在何处设置核心数据堆栈。您正在使用 NSPersistentDocument 吗?我遇到了一个问题,即运行循环需要在托管对象上下文开始工作之前运行一次,但我必须考虑这是否是您在这里看到的问题。

-tableView:viewForTableColumn:row 中的代码存在问题,即您可能会一遍又一遍地设置绑定(bind)。您应该只为单元格 View 的每个实例执行一次此操作。即使您想在代码中设置数组 Controller ,我建议您考虑在 Nib 中绑定(bind)单元格 View 的 subview ,因为它就在那里。或者,如果您在代码中执行此操作,则需要找到一种方法,每个 View 只执行一次。不过,我不认为这会导致你的问题。

风格要点:在代码中,使用 self.accountArrayControllerself.gdcManagedObjectContext 而不是 _accountArrayController_gdcManagedObjectContext >。此外,您还可以使用其他绑定(bind)类型的常量:NSContentBindingNSSelectionIndexesBinding

关于cocoa - 以编程方式绑定(bind) NSTableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224257/

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