简体   繁体   English

addTarget:action:forControlEvents:无法识别的选择器发送到实例-uitablecell中的uibutton

[英]addTarget:action:forControlEvents: unrecognized selector sent to instance - uibutton in uitablecell

* EDIT: Sorry, just realised - this code was working fine, until I made the table have three sections. *编辑:对不起,刚刚意识到-该代码运行良好,直到我将表分为三部分为止。 When it was a single section with section headings evrything worked fine when scrolling. 当它是带有节标题的单个节时,滚动时,evrything效果很好。 Now I have theree sections it crashes when scrolling.* 现在我有三个部分,滚动时会崩溃。*

I'm adding a button to a uitablecell. 我在uitablecell中添加了一个按钮。 Crash occurs when table contents extend beyond table height, and the table is scrolled extreme bottom. 当表格内容超出表格高度,并且表格滚动到最底端时,会发生崩溃。

From the error it looks as if the UIButton isn't being created, it reports back JobsCell instead... 从错误看起来好像没有创建UIButton,而是向JobsCell报告。

Also the layout in the custom UITableCell goes awry. 自定义UITableCell中的布局也出错了。 it looks like the JobsCell class isn't being initiated for cells that need to be reused and displayed back on screen? 似乎没有为需要重用并重新显示在屏幕上的单元格初始化JobsCell类?

    2014-03-20 15:20:32.080 myApp[52350:60b] mapBtn: <UIButton: 0xa89aff0; frame = (0 0; 59 59); opaque = NO; autoresize = RM+BM; tag = 12; layer = <CALayer: 0xa89b1a0>> 2 1
    2014-03-20 15:20:32.313 myApp[52350:60b] mapBtn: <UIButton: 0xa460620; frame = (0 0; 59 59); opaque = NO; autoresize = RM+BM; tag = 12; layer = <CALayer: 0xa469b60>> 0 11
    2014-03-20 15:20:33.512 myApp[52350:60b] mapBtn: <JobsCell: 0xa761ac0; baseClass = UITableViewCell; frame = (0 775; 320 60); autoresize = W; tag = 12; layer = <CALayer: 0xa761e20>> 0 12
2014-03-20 15:20:33.512 myApp[52350:60b] -[JobsCell addTarget:action:forControlEvents:]: unrecognized selector sent to instance 0xa761ac0
2014-03-20 15:20:33.514 myApp[52350:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[JobsCell addTarget:action:forControlEvents:]: unrecognized selector sent to instance 0xa761ac0'
*** First throw call stack:
(
    0   CoreFoundation                      0x024461e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x020178e5 objc_exception_throw + 44
    2   CoreFoundation                      0x024e3243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x0243650b ___forwarding___ + 1019
    4   CoreFoundation                      0x024360ee _CF_forwarding_prep_0 + 14
    5   ESC GasCert                         0x0014a109 -[Home_IPVC tableView:cellForRowAtIndexPath:] + 2873
    6   UIKit                               0x00a5d11f -[UITableView _createPreparedCellForGlobalRow:withIndexPath:] + 412
    7   UIKit                               0x00a5d1f3 -[UITableView _createPreparedCellForGlobalRow:] + 69
    8   UIKit                               0x00a3ede7 -[UITableView _updateVisibleCellsNow:] + 2197
    9   UIKit                               0x00a536a5 -[UITableView layoutSubviews] + 213
    10  UIKit                               0x009d3964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    11  libobjc.A.dylib                     0x0202982b -[NSObject performSelector:withObject:] + 70
    12  QuartzCore                          0x0429445a -[CALayer layoutSublayers] + 148
    13  QuartzCore                          0x04288244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    14  QuartzCore                          0x042880b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
    15  QuartzCore                          0x041ee7fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
    16  QuartzCore                          0x041efb85 _ZN2CA11Transaction6commitEv + 393
    17  QuartzCore                          0x042bccc6 _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 474
    18  QuartzCore                          0x042bd147 _ZN2CA7Display16TimerDisplayLink8callbackEP16__CFRunLoopTimerPv + 123
    19  CoreFoundation                      0x02404ac6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    20  CoreFoundation                      0x024044ad __CFRunLoopDoTimer + 1181
    21  CoreFoundation                      0x023ec538 __CFRunLoopRun + 1816
    22  CoreFoundation                      0x023eb9d3 CFRunLoopRunSpecific + 467
    23  CoreFoundation                      0x023eb7eb CFRunLoopRunInMode + 123
    24  GraphicsServices                    0x036585ee GSEventRunModal + 192
    25  GraphicsServices                    0x0365842b GSEventRun + 104
    26  UIKit                               0x00964f9b UIApplicationMain + 1225
    27  ESC GasCert                         0x0001626d main + 141
    28  ESC GasCert                         0x00002865 start + 53
)
libc++abi.dylib: terminating with uncaught exception of type NSException

But same code in both classes (except line turning cell clear). 但是在两个类中都使用相同的代码(除了使行单元格清晰以外)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"JobCell";

    UITableViewCell *cell;
    NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];

    if ( 6 <= [[versionCompatibility objectAtIndex:0] intValue] )
    {
        // iOS6 is installed
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    }
    else
    {
        // iOS5 is installed
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier ];
    }

    // * ios7 table fix
    [cell setBackgroundColor:[UIColor clearColor]];


    Job *job = 0;
    int jobsaved = 0;
    NSString *jobString = @"";
    NSString *jobPostcode = @"";
    NSString *jobDate = @"";

    // Configure the cell...
    if (indexPath.section==0)
    {
        job = [self.jobs objectAtIndex:indexPath.row];
        jobsaved = job.jobSaved;
        jobString = job.jobAddress;
        jobPostcode = job.jobPostcode;
        jobDate = job.jobDate;
    }
    else if (indexPath.section==1)
    {
        job = [self.jobsCommercial objectAtIndex:indexPath.row];
        jobsaved = job.jobSaved;
        jobString = job.jobAddress;
        jobPostcode = job.jobPostcode;
        jobDate = job.jobDate;
    }
    else if (indexPath.section==2)
    {
        Service *service = [self.jobsServices objectAtIndex:indexPath.row];
        jobsaved = service.jobSaved;
        jobString = service.jobAddress;
        jobPostcode = service.jobPostcode;
        jobDate = service.jobDate;
    }

    UIColor *redcol = [UIColor colorWithRed:0.62745098039216 green:0.15294117647059 blue:0.15686274509804 alpha:1.0];

    jobString = [jobString stringByAppendingString:@", "];
    jobString = [jobString stringByAppendingString:jobPostcode];

    //cell.textLabel.text = jobString;

    UILabel *jobLabel = (UILabel *)[cell viewWithTag:10];
    jobLabel.text = jobString;


    if (jobsaved == 1)
    {
        jobLabel.textColor = redcol;
    }
    else
    {
        jobLabel.textColor = [UIColor blackColor];
    }

    UILabel *dateLabel = (UILabel *)[cell viewWithTag:11];

    if (! [jobDate isEqualToString:@""]) {

        NSDateFormatter *formater = [[NSDateFormatter alloc] init];
        [formater setDateFormat:@"yyyy-MM-dd"];

        NSDate *date2 = [formater dateFromString:jobDate];
        [formater setDateFormat:@"d MMM YYYY"];

        NSString *date = [formater stringFromDate:date2];

        dateLabel.text = date;

    }
    else
    {
        dateLabel.text = @"";
    }

    UIButton *mapBtn = (UIButton *)[cell viewWithTag:12];
    NSLog(@"mapBtn: %@ %d %d",mapBtn, indexPath.section, indexPath.row);
    [mapBtn addTarget:self action:@selector(showMap:) forControlEvents:UIControlEventTouchUpInside];
    cell.tag = indexPath.row;

    return cell;
}

JobsCell.h JobsCell.h

#import <UIKit/UIKit.h>

@interface JobsCell : UITableViewCell

@property (nonatomic, strong) IBOutlet UILabel *jobLabel;
@property (nonatomic, strong) IBOutlet UILabel *dateLabel;
@property (nonatomic, strong) IBOutlet UIButton *mapBtn;

@end

JobsCell.m JobsCell.m

#import "JobsCell.h"

@implementation JobsCell

@synthesize jobLabel;

- (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

from your log we can see tag = 12; 从您的日志中,我们可以看到tag = 12; has JobsCell object not UIButton JobsCell对象而不是UIButton

 mapBtn: <JobsCell: 0xa761ac0; baseClass = UITableViewCell; frame = (0 775; 320 60); autoresize = W; **tag = 12;** layer = <CALayer: 0xa761e20>> 0 12

the source of problem in this line cell.tag = indexPath.row; 此行中问题的根源cell.tag = indexPath.row; because is can be 12 too 因为也可以是12

Your cell has sets tag as indexPath.row cell.tag = indexPath.row; 您的单元格已将标签设置为indexPath.row cell.tag = indexPath.row;

Let's try below 让我们尝试下面

[cell.mapBtn addTarget:self action:@selector(showMap:) forControlEvents:UIControlEventTouchUpInside];

Thanks! 谢谢!

You're trying to get the button by some undefined tag ( 12 ) . 您正在尝试通过一些未定义的标签来获取按钮12 You can make your life easier by replacing the following code: 您可以通过替换以下代码来简化生活:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"JobCell";

    JobsCell *cell;
    if ([tableView respondsToSelector:@selector(dequeueReusableCellWithIdentifier:forIndexPath:)])
    {
        // iOS6 is installed
        cell = (JobsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    }
    else
    {
        // iOS5 is installed
        cell = (JobsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier ];
    }

    // * ios7 table fix
    [cell setBackgroundColor:[UIColor clearColor]];


    Job *job = nil;
    int jobsaved = 0;
    NSString *jobString = @"";
    NSString *jobPostcode = @"";
    NSString *jobDate = @"";

    // Configure the cell...
    if (indexPath.section==0)
    {
        job = [self.jobs objectAtIndex:indexPath.row];
        jobsaved = job.jobSaved;
        jobString = job.jobAddress;
        jobPostcode = job.jobPostcode;
        jobDate = job.jobDate;
    }
    else if (indexPath.section==1)
    {
        job = [self.jobsCommercial objectAtIndex:indexPath.row];
        jobsaved = job.jobSaved;
        jobString = job.jobAddress;
        jobPostcode = job.jobPostcode;
        jobDate = job.jobDate;
    }
    else if (indexPath.section==2)
    {
        Service *service = [self.jobsServices objectAtIndex:indexPath.row];
        jobsaved = service.jobSaved;
        jobString = service.jobAddress;
        jobPostcode = service.jobPostcode;
        jobDate = service.jobDate;
    }

    UIColor *redcol = [UIColor colorWithRed:0.62745098039216 green:0.15294117647059 blue:0.15686274509804 alpha:1.0];

    jobString = [jobString stringByAppendingString:@", "];
    jobString = [jobString stringByAppendingString:jobPostcode];

    //cell.textLabel.text = jobString;

    UILabel *jobLabel = (UILabel *)[cell viewWithTag:10];
    jobLabel.text = jobString;


    if (jobsaved == 1)
    {
        jobLabel.textColor = redcol;
    }
    else
    {
        jobLabel.textColor = [UIColor blackColor];
    }

    UILabel *dateLabel = (UILabel *)[cell viewWithTag:11];

    if (! [jobDate isEqualToString:@""]) {

        NSDateFormatter *formater = [[NSDateFormatter alloc] init];
        [formater setDateFormat:@"yyyy-MM-dd"];

        NSDate *date2 = [formater dateFromString:jobDate];
        [formater setDateFormat:@"d MMM YYYY"];

        NSString *date = [formater stringFromDate:date2];

        dateLabel.text = date;

    }
    else
    {
        dateLabel.text = @"";
    }

    UIButton *mapBtn = cell.mapBtn;
    NSLog(@"mapBtn: %@ %d %d",mapBtn, indexPath.section, indexPath.row);
    [mapBtn addTarget:self action:@selector(showMap:) forControlEvents:UIControlEventTouchUpInside];
    cell.tag = indexPath.row;

    return cell;
}

Please also note how I tested for which dequeueReusableCell method I called - you should never check system version numbers. 另请注意,我如何测试调用了哪个dequeueReusableCell方法-切勿检查系统版本号。 And pointers should be set to nil , not 0. 并且指针应设置为nil ,而不是0。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法识别的选择器发送到 UIButton 中的实例 - Unrecognized selector sent to instance in UIButton [UIButton copyWithZone:]:无法识别的选择器已发送到实例 - [UIButton copyWithZone:]: unrecognized selector sent to instance [UIButton setText:]: 无法识别的选择器发送到实例 - [UIButton setText:]: unrecognized selector sent to instance Swift 3 无法识别的选择器发送到实例 UIButton - Swift 3 Unrecognized selector sent to instance UIButton 表格单元中的UIButton“无法识别的选择器已发送到实例” - UIButton in table cell “unrecognized selector sent to instance” 错误:--[UIButton setValue:]:无法识别的选择器已发送到实例 - Error :- -[UIButton setValue:]: unrecognized selector sent to instance 具有自定义视图的UIButton-addTarget:action:forControlEvents:不起作用 - UIButton with custom view - addTarget:action:forControlEvents: does not work UIButton的替代选项addTarget:action:forControlEvents:IOS中的方法 - Alternative option of UIButton addTarget:action:forControlEvents: method in IOS SubClassing UIButton但我不能让“addTarget:action:forControlEvents:”执行? - SubClassing UIButton but I can't get “addTarget:action:forControlEvents:” to execute? UIButton addTarget:action:forControlEvents:不能将自己用作目标吗? - UIButton addTarget:action:forControlEvents: not working using itself as a target?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM