2013-12-16 3 views
0

У меня очень странная проблема, которую я не понимаю. У меня есть 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; 
} 
+1

Пара предложений по отладке: запустите с зомби и посмотрите, есть ли у вас более эффективная информация об ошибках, зарегистрируйте какое-либо сообщение в методе 'didSelectRowAtIndexPath' и посмотрите, выполняется ли он. (Я удивлен, что в консольном журнале не указано, к чему стремится объект objc_msgSend.) –

+0

Вы вызываете метод «didSelectRowAtIndexPath» как пользовательский? – sathiamoorthy

+0

Можете ли вы перейти к «Breakpoint navigator» и добавить контрольную точку исключения для всех исключений? Затем вы можете распечатать трассировку исключения здесь, и это поможет нам исследовать ее. Вы можете следить за этим: http://stackoverflow.com/a/14767076/1582255 – rordulu

ответ

2

Вы создаете RefineSearchViewController в качестве локальной переменной. Предполагая, что ваш проект использует ARC, он будет освобожден, если эта ссылка выходит за пределы области (конец метода, который ее создал).

Сделать сильное свойство в контроллере представления, который создает его и назначает вместо него.

+0

Спасибо человеку! Создание собственности так сильно решило мою проблему, огромное спасибо! – Carnal

1

После последнего вставленного кода это нормально, что приложение сбой. На самом деле вы должны сохранить ссылку на новый VC (RefineSearchViewController). Для того, чтобы отобразить его содержимое, вы

[self.refineSearchContainer addSubview:refineSearchController.view];  

[self.view addSubview:self.refineSearchContainer];

Но VC теряется. Вы можете использовать контейнер View механизм контроллера с помощью этого метода

- (void)addChildViewController:(UIViewController *)childController 

или более легко использовать в NavigationController с pushViewController: в зависимости от того, что вы хотите сделать.

+0

Спасибо за подсказку, сделав свойство сильным, было достаточно! – Carnal

+0

Использование моего первого метода имеет еще одно преимущество: дочерний viewController автоматически получает методы жизненного цикла VC: viewWillAppear, viewWillDisappear, ... –

+0

Спасибо большое, я буду помнить об этом :) – Carnal

Смежные вопросы