将自定义NSButton链接到基于视图的表行和操作

时间:2011-11-23 09:18:48

标签: objective-c cocoa

我有一个基于视图的表,其中包含自定义单元格视图。在这个自定义单元格视图中,我有一个自定义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

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

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

1 个答案:

答案 0 :(得分:1)

如何添加委托字段并使用自定义初始化程序进行设置?或者您可以将其添加为属性并在调用alloc init之后设置它。这可以通过两种方式完成:通过IB或以编程方式。

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

那么让我们看看里面有UITableView元素的类。假设此类也是UITableViewDelegateUITableViewDataSource,则必须具有数据源方法的实现

- (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键从按钮拖动到单元格。

希望这有帮助!