У меня очень странная проблема, которую я не понимаю. У меня есть UITableView
, который вызывает сбой при нажатии на строку.iOS - didSelectRowAtIndexPath вызывает сбой в приложении
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.delegate = self; <-- If I remove this, no crash caused
self.tableView.dataSource = self;
Самое смешное, что у меня нет кода вообще внутри didSelectRowAtIndexPath
, и до сих пор выходит из строя? В журнале не сказано много, я получаю (lldb)
, но, посмотрев немного дальше, я получил это от отладчика.
[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]
является причиной? Я не понимаю, как решить эту проблему.
Thread 1, Queue : com.apple.main-thread
#0 0x02b1909f in objc_msgSend()
#1 0x01afb285 in -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]()
#2 0x01afb4ed in -[UITableView _userSelectRowAtPendingSelectionIndexPath:]()
#3 0x025055b3 in __NSFireDelayedPerform()
#4 0x034f9376 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__()
#5 0x034f8e06 in __CFRunLoopDoTimer()
#6 0x034e0a82 in __CFRunLoopRun()
#7 0x034dff44 in CFRunLoopRunSpecific()
#8 0x034dfe1b in CFRunLoopRunInMode()
#9 0x03b387e3 in GSEventRunModal()
#10 0x03b38668 in GSEventRun()
#11 0x01a4bffc in UIApplicationMain()
#12 0x000125bd in main at /Users/damianmendez/dev/trigd/jagodu-ios/Jagodu/Jagodu/main.m:16
#13 0x725 in start()
У кого-нибудь есть предложения? Спасибо.
EDIT: После включен зомби, как @Phillip Millis сказал мне тоже, я получил это:
*** -[RefineSearchViewController tableView:didSelectRowAtIndexPath:]: message sent to deallocated instance 0x9d24030
UPDATE:
Код для добавления RefineSearchViewController (which has a UITableView)
RefineSearchViewController *refineSearchController = [[RefineSearchViewController alloc] initWithTransparentViews];
refineSearchController.parentDelegate = self.parentDelegate;
CGRect searchFrame = refineSearchController.view.frame;
searchFrame.origin.y = titleLabel.frame.origin.y + titleLabel.frame.size.height + 5;
refineSearchController.view.frame = searchFrame;
[self.refineSearchContainer addSubview:refineSearchController.view];
[self.view addSubview:self.refineSearchContainer];
Код для initing RefineSearchViewController
-(RefineSearchViewController*)init {
self = [super init];
if (self) {
JoDModel *model = [JoDModel defaultModel];
self.title = @"Search profile";
_propertyNames = model.searchProfilePropertyNames;
_properties = model.searchProfileProperties;
_doneInvocation = nil;
_isRefineSearch = NO;
_transparentViews = NO;
}
return self;
}
-(RefineSearchViewController*)initWithTransparentViews {
self = [self init];
if (self) {
_transparentViews = YES;
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.titleShadow.hidden = !_addShadow;
JoDModel *model = [JoDModel defaultModel];
UIBarButtonItem *doneButton;
if (_isRefineSearch) {
doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Search" style:UIBarButtonItemStylePlain target:self action:@selector(done)];
_keyboardBg = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, model.keyboardHeight)];
_keyboardBg.backgroundColor = [UIColor blackColor];
[self.view addSubview:_keyboardBg];
} else {
doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Search" style:UIBarButtonItemStylePlain target:self action:@selector(performSearch)];
}
self.navigationItem.rightBarButtonItem = doneButton;
// When entering this view controller, the user will probably make a new search soon, therefore it's important to update the geo location
if (model.shareMyLocation) {
JoDAppDelegate *appDelegate = (JoDAppDelegate*)[UIApplication sharedApplication].delegate;
[appDelegate updateLocation];
}
}
-(void)dealloc {
self.tableView = nil;
_propertyNames = nil;
_properties = nil;
_doneInvocation = nil;
_titleShadow = nil;
_keyboardBg = nil;
}
Пара предложений по отладке: запустите с зомби и посмотрите, есть ли у вас более эффективная информация об ошибках, зарегистрируйте какое-либо сообщение в методе 'didSelectRowAtIndexPath' и посмотрите, выполняется ли он. (Я удивлен, что в консольном журнале не указано, к чему стремится объект objc_msgSend.) –
Вы вызываете метод «didSelectRowAtIndexPath» как пользовательский? – sathiamoorthy
Можете ли вы перейти к «Breakpoint navigator» и добавить контрольную точку исключения для всех исключений? Затем вы можете распечатать трассировку исключения здесь, и это поможет нам исследовать ее. Вы можете следить за этим: http://stackoverflow.com/a/14767076/1582255 – rordulu