[英]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.