gpt4 book ai didi

objective-c - Objective C - 向空 NSTableView 添加新行

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

我有一个基于 View 的 NSTableView,它最初应该是空的。我还有“添加”和“删除”按钮,用于从同一 NSTableView 添加和删除行。

我的委托(delegate)方法和添加新行的方法如下所示:

#import "PreferencesApiKeysViewController.h"
#import "UserKeys.h"

@interface PreferencesApiKeysViewController ()

@property (weak) IBOutlet NSTableView *keysTableView;

@end

@implementation PreferencesApiKeysViewController
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
// Get a new ViewCell
NSTableCellView *cellView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];

if([tableColumn.identifier isEqualToString:@"userKeysColumn"]) {
UserKeys *allKeys = [self.allKeys objectAtIndex:row];
cellView.textField.stringValue = allKeys.userKeyName;
return cellView;
}
return cellView;
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
NSLog(@"Initial rows: %li", (unsigned long)[self.allKeys count]);
return [self.allKeys count];
}

- (IBAction)addKey:(id)sender {
UserKeys *newKey = [[UserKeys alloc] initWithKeyName:@""
apiID:@""
apiCode:@"" ];

[self.allKeys addObject:newKey];
NSLog(@"Total rows: %li", (unsigned long)self.allKeys.count);
NSInteger newRowIndex = self.allKeys.count;
if (newRowIndex == 0) {
NSLog(@"No rows.");
newRowIndex = 0;
} else {
NSLog(@"Has rows.");
newRowIndex = self.allKeys.count-1;
}
NSLog(@"New Index: %ld", (long)newRowIndex);

[self.keysTableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:newRowIndex] withAnimation:NSTableViewAnimationSlideDown];

[self.keysTableView selectRowIndexes:[NSIndexSet indexSetWithIndex:newRowIndex] byExtendingSelection:NO];
[self.keysTableView scrollRowToVisible:newRowIndex];
}

@end

在我的 AppDelegate.m 中,我这样调用我的 View :

#import "AppDelegate.h"
#import "UserKeys.h"
#include "PreferencesApiKeysViewController.h"

@interface AppDelegate()
@property (nonatomic,strong) IBOutlet PreferencesApiKeysViewController *prefsViewController;
@end

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.prefsViewController = [[PreferencesApiKeysViewController alloc] initWithNibName:@"PreferencesApiKeysViewController" bundle:nil];

// Create few rows as dummy data
/*
UserKeys *key1 = [[UserKeys alloc] initWithKeyName:@"key one"
apiID:@"123"
apiCode:@"xxx" ];

UserKeys *key2 = [[UserKeys alloc] initWithKeyName:@"key two"
apiID:@"456"
apiCode:@"yyy" ];
NSMutableArray *tempKeys = [NSMutableArray arrayWithObjects:key1, key2, nil];
self.prefsViewController.allKeys = tempKeys;
*/
// done.

[self.window.contentView addSubview:self.prefsViewController.view];
self.prefsViewController.view.frame = ((NSView*)self.window.contentView).bounds;
}

@end

现在,这里的问题是,如果我取消注释在 AppDelegate 中添加虚拟数据的几行并启动我的应用程序,一切都会正常。我可以毫无问题地添加/删除行,甚至可以删除所有行,然后添加新行。

但是,如果我再次注释这些行,我的应用程序将从一个空表开始(这就是我需要的),当我想添加新行时,我会收到错误:

*** Assertion failure in -[NSTextFieldCell _objectValue:forString:errorDescription:], /SourceCache/AppKit/AppKit-1187.34/AppKit.subproj/NSCell.m

进一步查看该线程,我只看到一行引用我的应用程序:

0x0000000100003116 -[PreferencesApiKeysViewController tableView:viewForTableColumn:row:] + 406

我猜测如果 allKeys 数组实际上不包含任何单个对象,我的 TableView 未正确实例化,但我不确定如何解决这个问题?如何创建一个空的 NSTableView 并能够在单击“添加”按钮时自行添加第一行(不向 allKeys 添加任何虚拟数据)?

最佳答案

将此添加到 PreferencesApiKeysViewController 的实现中:

@implementation PreferencesApiKeysViewController

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle {
if ((self = [super initWithNibName:nibName bundle:bundle])) {
self.allKeys = [NSMutableArray array];
}
return self;
}

// add the following only if not using ARC
- (void)dealloc {
[_allKeys release];
[super dealloc];
}

@end

当您允许编译注释掉的代码时,会发生的情况是将一个 NSMutableArray 实例分配给 allKeys 实例变量。因此,添加和删除项目将按照您的预期进行。

通常,在这种情况下,管理 NSMutableArray 的类应该重写 init 方法,以确保数组正确初始化为空数组。 (默认情况下,非 IBOutlet 实例变量被初始化为 nil,这将不允许您正确地添加或删除其中的项目)。

关于objective-c - Objective C - 向空 NSTableView 添加新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15004614/

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