2014-01-14 1 views
0

У меня есть модальный UIViewController, на котором есть UITableView. Для любой ячейки, которую пользователь выбирает, я хочу вернуть этот текст на предыдущий контроллер представления и отклонить модальное представление. Я использую NSNotifications для отправки значения обратно. Проблема в том, что мое уведомление так и не было получено.NSNotification не возвращается

Вот код, с точки зрения «родительским»:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(choiceReceived:) 
               name:@"selectionMade" 
               object:nil]; 

    [self performSegueWithIdentifier: @"locationsDetailsSegue" sender: self]; 
} 

- (void) choiceReceived: (NSNotification *) notification 
{ 
    NSLog(@"test"); 

    NSDictionary *dict = [notification userInfo]; 
    NSString *user_choice = [dict objectForKey:@"choice"]; 

    NSLog(@"%@", user_choice); 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name: @"selectionMade" 
                object:nil]; 
} 

И в модальный контроллер представления:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    NSString *choice = cell.textLabel.text; 

    // send a notification of this choice back to the 'parent' controller 
    NSDictionary *dict = [NSDictionary dictionaryWithObject:choice forKey:@"choice"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"selectionMade" object:nil userInfo:dict]; 

    NSLog(@"%@", [dict objectForKey:@"choice"]); 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

я получаю правильный выход из уведомителя, но я не получаю никакого вывода от получателя. Мне что-то не хватает? Благодаря!

+1

Является ли оригинальная VC определенно еще живой, когда уведомление отправлено? –

+1

Является ли реализация родительского представления 'tableView: didSelectRowAtIndexPath:' всегда вызывается перед реализацией контроллера modal view 'tableView: didSelectRowAtIndexPath:' is? Это разные таблицы, верно? – ThomasW

+0

@ JoshCaswell - Я не уверен на 100%. Оригинальный VC называет этот VC модально, поэтому я считаю, что он все еще существует, но я не знаю, как это проверить. Я использую этот шаблон в других ситуациях, и он всегда работает, поэтому я не знаю, почему здесь это не удается. Я думаю, что я рассмотрю шаблон делегата, так как мне все равно нужно это узнать. – Alex

ответ

4

Ну, я не люблю использовать NSNotificationCenter в таком сценарии (Его просто мое предложение). В любом случае я всегда рекомендую шаблон делегирования. Образцы делегирования работают или сообщают об уведомлении об объекте «один к одному», поэтому он дает 100% точный вывод и устраняет другие конфликты.
Создайте методы протокола в childviewcontroller и делегируйте свойство для подтверждения в parentclassviewcontroller. Использовать протокол chileviewcontroller в parentviewcontroller. Внедрение необходимых методов делегирования протокола в классе parentviewcontroller. Также вы можете отправлять несколько типов аргументов методом делегатов. для получения дополнительной информации пройти через это doc.

+0

Спасибо. Я потратил некоторое время и встал, чтобы ускориться по шаблону делегата. Гораздо надежнее. – Alex