【问题标题】:Linking Custom NSButton to View Based Table Row and Action将自定义 NSButton 链接到基于视图的表格行和操作
【发布时间】:2011-11-23 09:18:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    如何添加一个委托字段并使用自定义初始化程序进行设置?或者您可以将其添加为属性并在调用 alloc init 后对其进行设置。这可以通过 2 种方式完成:通过 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-drag 从按钮到单元格。

    希望这会有所帮助!

    【讨论】:

    • 谢谢,Warkst。我将行的委托设置为另一个控制器。然后,我向 checkButton 添加了一个名为 selectedRow 的属性。在 viewForTableColumn 方法中,我为 checkButton 设置了选定的行。然后自定义按钮类的 onCheck 方法调用如下: [[self delegate] toggleHighlightSelectedRow: selectedRow];然后,从委托控制器中,我可以访问所选行并根据需要设置行突出显示。非常感谢您的帮助。
    • 问题是关于macOS,这个答案是iOS!?!?!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多