【问题标题】:uibutton within custom uitablecell自定义uitablecell中的uibutton
【发布时间】:2012-05-24 08:59:20
【问题描述】:

我正在通过 xcode 和目标 c 构建一个 iphone 应用程序。为 ios5.0 min 目标构建。 我创建了一个自定义的 uitablecell 并将其加载到视图控制器的表中没有问题。此单元格包含一个按钮。当用户在任何单元格中点击此按钮时,我希望它在视图控制器中调用相同的函数。我过去这样做的方法是使自定义单元格的文件所有者成为有问题的视图控制器,然后简单地控制将按钮拖动到视图控制器中并将 ibaction 函数放在那里。总是工作没问题。到现在为止。

-[__NSCFString loadMerchant:]: 无法识别的选择器发送到实例 0x8689e50 2012-05-24 09:56:14.630 [3217:16103] * 终止 应用程序由于未捕获的异常“NSInvalidArgumentException”,原因: '-[__NSCFString loadMerchant:]: 无法识别的选择器发送到实例 0x8689e50'

这是我得到的错误。我确保该功能不会意外链接到错误的按钮,该功能也不会错误地出现在 cell.m 中,以及我能想到的任何其他简单错误。

有谁知道完成我想要做的事情的正确方法?

编辑:自定义单元格

@interface TimelineCell : UITableViewCell


@property (weak, nonatomic) IBOutlet UIButton *nameButton;


@end


@implementation TimelineCell


@synthesize nameButton;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self; }

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state }

@end 

下面是视图控制器

 - (IBAction)loadMerchant:(id)sender;

 - (IBAction)loadMerchant:(id)sender { }

就是这样。当按钮被点击并出现上述错误时会发生崩溃

编辑:在 nib 文件中删除链接并只是将操作添加到按钮似乎可以解决问题,但如果有人能对此有所了解,我仍然希望知道它的原因

在 cellForRowAtIndexPath 内制作

 UIButton *b = (UIButton*)[cell viewWithTag:1];
 [b addTarget:self action:@selector(loadMerchant:) forControlEvents:UIControlEventTouchUpInside];

【问题讨论】:

  • 抱歉编辑了那里的一些代码。但它非常基本不明白为什么它会失败。当同样的 ahs 之前工作了这么多次时
  • 从您调用 loadMerchant 方法的地方,您也可以添加该代码吗?
  • 您是否再次检查了 .xib 中 mameButton 中的 loadMerchant 方法链接?
  • rishi 从 nib 文件中的 namebutton 和 viewcontroller 中的 ibaction 建立的链接调用 loadmerchant。我的代码中的物理调用不存在。我已经仔细检查了链接是否已建立。如果没有建立链接,它甚至根本不会崩溃,因为它无论如何都不知道 loadmerchant 函数。这对我来说是个谜:(
  • 我认为这个错误意味着您调用 loadMerchant 的对象已被释放。如果没有在代码中调用此方法,那么我建议您确保 TimelineCell 的实例在需要之前没有被释放。

标签: objective-c ios ios5 uibutton


【解决方案1】:

我最终做的是在 nib 文件中标记按钮,然后在代码中通过 cellForRowAtIndexPath 中设置的单元格中的代码添加目标。

UIButton *b = (UIButton*)[cell viewWithTag:1];
 [b addTarget:self action:@selector(loadMerchant:) forControlEvents:UIControlEventTouchUpInside];

虽然这解决了问题,但我仍然不确定为什么通过 IB 建立的链接首先失败。

【讨论】:

  • 如果您不连接到“文件所有者”,而是连接到自定义对象,我相信您可以使用 Interface Builder 解决此问题。
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多