我有一个基于视图的表,其中包含自定义单元格视图。在这个自定义单元格视图中,我有一个自定义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
当前解决方案根本不会将按钮与行相关联。例如,当我对行进行排序时,即使选择了不同的行,所选图像也不会链接到该行,并且通常会保留在表格中的相同位置。
对此的任何帮助将不胜感激。
答案 0 :(得分:1)
如何添加委托字段并使用自定义初始化程序进行设置?或者您可以将其添加为属性并在调用alloc init之后设置它。这可以通过两种方式完成:通过IB或以编程方式。
如果您想以编程方式执行此操作,则需要执行以下操作:
那么让我们看看里面有UITableView
元素的类。假设此类也是UITableViewDelegate
和UITableViewDataSource
,则必须具有数据源方法的实现
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
返回给定indexPath的单元格。在这里,您可以实例化自定义单元格,然后添加自定义按钮并将其委托给单元格本身,方法是将其添加到您的代码中:
CustomCheckButton.h中的:
UITableViewCell * delegate;
//...
@property (nonatomic, assign) UITableViewCell * delegate;
CustomCheckButton.m中的
@synthesize delegate;
在表视图数据源方法中:
// 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
,您将能够像平常一样设置其委托属性,按住Ctrl键从按钮拖动到单元格。
希望这有帮助!