gpt4 book ai didi

objective-c - 将自定义 NSButton 链接到基于 View 的表行和操作

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

我有一个基于 View 的表格,带有自定义单元格 View 。在这个自定义单元格 View 中,我有一个自定义 NSButton,其作用类似于复选框(它打开和关闭自定义图像)。这部分效果很好。图像完美地打开和关闭。

我想要做的是将行中的自定义按钮与表中的实际行相关联。当我检查/单击按钮时,它将突出显示相应的行,然后对复选框/按钮所在的行执行操作。例如,单击 NSButton 时从表中删除该行。

我的自定义 NSButton 实现如下:

头文件:

#import <Foundation/Foundation.h>

@interface CustomCheckButton : NSButton {
BOOL _checked;
}

@property (nonatomic, setter=setChecked:) BOOL checked;

-(void) setChecked:(BOOL) check;
@end

实现:

#import "CustomCheckButton.h"

@implementation CustomCheckButton

@synthesize checked = _checked;

-(id) init
{
if( self=[super init] )
{
self.checked = NO;
[self setTarget:self];
[self setAction:@selector(onCheck:)];
}
return self;
}

-(void) awakeFromNib
{
self.checked = NO;
[self setTarget:self];
[self setAction:@selector(onCheck:)];
}

-(void) setChecked:(BOOL) check
{
_checked = check;
if( _checked )
{
NSImage* img = [NSImage imageNamed:@"check_on.png"];
[self setImage:img];
[self setState:NSOnState];
}
else
{
NSImage* img = [NSImage imageNamed:@"check_off.png"];
[self setImage:img];
[self setState:NSOffState];
}
}

-(void) onCheck:(id) sender
{
self.checked = !_checked;
NSLog(@"A check box was pressed");
}

@end

当前的解决方案根本不将按钮与行关联起来。例如,当我对行进行排序时,所选图像不会链接到该行,并且通常保留在表中的同一位置,即使选择了不同的行也是如此。

对此的任何帮助将不胜感激。

最佳答案

添加委托(delegate)字段并使用自定义初始值设定项进行设置怎么样?或者您可以将其添加为属性并在调用 alloc init 后进行设置。这可以通过两种方式完成:通过 IB 或以编程方式。

如果您想以编程方式执行此操作,则需要执行以下操作:

让我们看看其中包含 UITableView 元素的类。假设此类也是 UITableViewDelegateUITableViewDataSource,它必须具有数据源方法的实现

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

返回给定索引路径处的单元格。在这里,您可以实例化您的自定义单元格,并在其中添加一个自定义按钮并将其委托(delegate)设置为单元格本身,方法是将其添加到您的代码中:

在 CustomCheckButton.h 中:

UITableViewCell * delegate;
//...
@property (nonatomic, assign) UITableViewCell * delegate;

在 CustomCheckButton.m

@synthesize delegate;

在表格 View 数据源方法:

// initialize my custom cell element, assume it has a property for a CustomCheckButton with name checkButton
// ... some code
myCell.checkButton.delegate = mycell; // link the button's delegate to the cell
// ... some other code, probably based on indexPath
return myCell;

这似乎是一项艰巨的任务,但您也可以在界面生成器中完成它,假设您有一个用于自定义单元类的 xib。如果这样做,只需打开 xib。您可能已经有一个按钮了;将其类更改为您自己的 CustomCheckButton,您将能够像平常一样设置其委托(delegate)属性,按住 Ctrl 键从按钮拖动到单元格。

希望这有帮助!

关于objective-c - 将自定义 NSButton 链接到基于 View 的表行和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8239685/

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