Таинственная авария UIButton - PullRequest
0 голосов
/ 15 января 2012

У меня есть UITableViewCell, у которого есть 2 UIButton экземпляра.Обе кнопки имеют изображение по умолчанию.Только у «плохой» кнопки есть изображение для отключенного состояния.Ничего более.

В классе ячеек эти две кнопки объявлены как свойства с ключевым словом IBOutlet:

@property (nonatomic, readonly) IBOutlet UIButton* buttonCall;
@property (nonatomic, readonly) IBOutlet UIButton* buttonGPS;

Соединения между двумя кнопками в .xib и свойствами вкласс сделан.

Итак, когда загружается .xib, выполняется следующее:

MyCell* cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:cellID];
if (nil == cell)
{
    NSArray* nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil];
    cell = [nibContents objectAtIndex:0];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

// gps button
[cell.buttonGPS setTitle:[NSString stringWithFormat:@"%d", indexPath.row] forState:UIControlStateNormal];
[cell.buttonGPS addTarget:self action:@selector(actionGPS:) forControlEvents:UIControlEventTouchUpInside];

if (...condition...)
{
    cell.buttonCall.enabled = NO;
    [cell.buttonCall removeTarget:self action:@selector(actionCall:) forControlEvents:UIControlEventTouchUpInside];
}
else
{
    cell.buttonCall.enabled = YES;
    [cell.buttonCall setTitle:[...TheTitleString...] forState:UIControlStateNormal];
    [cell.buttonCall addTarget:self action:@selector(actionCall:) forControlEvents:UIControlEventTouchUpInside];
}

Когда появляется контроллер вида, он успешно проходит через (UITableViewCell*)tableView:cellForRowAtIndexPath: необходимое количество раз.,Затем происходит сбой приложения со следующим стеком:

0 kill
...
[UIButton imageRectForContentRect:]
[UIButton(UIButtonInternal) _setupImageView]
[UIButton layoutSubviews]
...
start

Я удалил изображение кнопки и начал падать со стеком:

0 kill
...
[UIButton layoutSubviews]
...
start

Я добавил несколько меток идентификаторов для кнопок - все ещесбой.

Удалено соединение XCode-InterfaceBuilder для кнопки «Плохо», и сбой прекратился.Но кнопка не работает.

Есть идеи, что вызывает сбои?

Стек вызовов:

0   CoreFoundation                      0x013d406e __exceptionPreprocess + 206
1   libobjc.A.dylib                     0x019f0d0a objc_exception_throw + 44
2   CoreFoundation                      0x013d5ced -[NSObject doesNotRecognizeSelector:] + 253
3   CoreFoundation                      0x0133af00 ___forwarding___ + 432
4   CoreFoundation                      0x0133ace2 _CF_forwarding_prep_0 + 50
5   UIKit                               0x0086de3a -[UIButton imageRectForContentRect:] + 350
6   UIKit                               0x0086ed5b -[UIButton(UIButtonInternal) _setupImageView] + 158
7   UIKit                               0x0086e5f8 -[UIButton layoutSubviews] + 693
8   UIKit                               0x0069f322 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 178
9   CoreFoundation                      0x013d5e72 -[NSObject performSelector:withObject:] + 66
10  QuartzCore                          0x0042092d -[CALayer layoutSublayers] + 266
11  QuartzCore                          0x0042a827 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 231
12  QuartzCore                          0x003b0fa7 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 377
13  QuartzCore                          0x003b2ea6 _ZN2CA11Transaction6commitEv + 374
14  QuartzCore                          0x003b2580 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 80
15  CoreFoundation                      0x013a89ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
16  CoreFoundation                      0x0133f670 __CFRunLoopDoObservers + 384
17  CoreFoundation                      0x0130b4f6 __CFRunLoopRun + 1174
18  CoreFoundation                      0x0130adb4 CFRunLoopRunSpecific + 212
19  CoreFoundation                      0x0130accb CFRunLoopRunInMode + 123
20  GraphicsServices                    0x03258879 GSEventRunModal + 207
21  GraphicsServices                    0x0325893e GSEventRun + 114
22  UIKit                               0x00660a9b UIApplicationMain + 1175
23  MyApp                               0x000023f9 main + 169
24  MyApp                               0x00002345 start + 53

Исключение составляет:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x146acd8'

info symbol 0x146acd8
__kCFNull in section LC_SEGMENT.__DATA.__data of /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation

Второй сценарий аналогичен.Исключение, однако, точно так же.Вот стек вызовов:

0   CoreFoundation                      0x013d406e __exceptionPreprocess + 206
1   libobjc.A.dylib                     0x019f0d0a objc_exception_throw + 44
2   CoreFoundation                      0x013d5ced -[NSObject doesNotRecognizeSelector:] + 253
3   CoreFoundation                      0x0133af00 ___forwarding___ + 432
4   CoreFoundation                      0x0133ace2 _CF_forwarding_prep_0 + 50
5   UIKit                               0x0086e851 -[UIButton layoutSubviews] + 1294
6   UIKit                               0x0069f322 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 178
7   CoreFoundation                      0x013d5e72 -[NSObject performSelector:withObject:] + 66
8   QuartzCore                          0x0042092d -[CALayer layoutSublayers] + 266
9   QuartzCore                          0x0042a827 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 231
10  QuartzCore                          0x003b0fa7 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 377
11  QuartzCore                          0x003b2ea6 _ZN2CA11Transaction6commitEv + 374
12  QuartzCore                          0x003b2580 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 80
13  CoreFoundation                      0x013a89ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
14  CoreFoundation                      0x0133f670 __CFRunLoopDoObservers + 384
15  CoreFoundation                      0x0130b4f6 __CFRunLoopRun + 1174
16  CoreFoundation                      0x0130adb4 CFRunLoopRunSpecific + 212
17  CoreFoundation                      0x0130accb CFRunLoopRunInMode + 123
18  GraphicsServices                    0x03258879 GSEventRunModal + 207
19  GraphicsServices                    0x0325893e GSEventRun + 114
20  UIKit                               0x00660a9b UIApplicationMain + 1175
21  MyApp                               0x000023f9 main + 169
22  MyApp                               0x00002345 start + 53

Ответы [ 2 ]

1 голос
/ 19 января 2012

Из этого исключения похоже, что вы думаете, что передаете NSString заголовку кнопки, а на самом деле вы передаете экземпляр NSNull.Это довольно часто, если вы извлекаете данные табличного представления из источника JSON или аналогичного - NSNull используется, если поле источника не существует.

Исключение, которое вы получаете, состоит в том, что длина не является распознанным селектором для NSNull.,Поэтому я бы сосредоточил ваше расследование в этой области.Проверьте, что вы на самом деле отправляете для заголовка кнопки.

0 голосов
/ 17 января 2012
MyCell* cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:cellID];
if (nil == cell)
{
    NSArray* nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil];
cell = [nibContents objectAtIndex:0];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell.buttonGPS addTarget:self action:@selector(actionGPS:)       forControlEvents:UIControlEventTouchUpInside];
[cell.buttonCall addTarget:self action:@selector(actionCall:) forControlEvents:UIControlEventTouchUpInside];
}

// gps button
[cell.buttonGPS setTitle:[NSString stringWithFormat:@"%d", indexPath.row] forState:UIControlStateNormal];

if (...condition...)
{
cell.buttonCall.enabled = NO;
}
else
{
cell.buttonCall.enabled = YES;
[cell.buttonCall setTitle:[...TheTitleString...] forState:UIControlStateNormal];
}

Сделайте эти изменения в вашем коде и проверьте. Я думаю, что какое-то условие может быть неправильным, поэтому b4 добавляя цель, она была удалена, а при попытке сбой.

...