0

У меня есть UIViewController с кнопкой, которая приносит еще UIViewController. нажав на кнопку, как показано на моем NSLog, и когда это будет сделано, я хочу отправить уведомление для загрузки еще одного viewcontroller. Ну, хотя кажется, все сделано правильно, так или иначе это не работает, и UIViewController не появляется. Вот код:Проблемы с NSNotificationCenter и загрузка UIViewControlletr

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(infoPage:) 
                name:@"InfoPage" object:nil ]; 



-(void) infoPage:(NSNotification*)notification 
{ 
    NSLog(@"Code executing in Thread %@",[NSThread currentThread]); 

    InfoCtrol *i = [[InfoCtrol alloc] init]; 
    i.hidesBottomBarWhenPushed = YES; 
    [self.navigationController pushViewController:i animated:YES]; 
} 

моя кнопка tabbaritem

-(void)info { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InfoPage" 
                 object:nil 
                 userInfo:nil]; 
    NSLog(@"test not"); 
} 

Я думаю, что моя проблема в том, что: Это не в mainThread, но я не знаю, как я должен решить, что:

Я также использовал это, но это не принесло UIViewController:

[self performSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:NO]; 

-(void)test{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InfoPage" 
                 object:nil 
                 userInfo:nil]; 
} 

Если я просто поместить этот код в кнопку, он отображает UIViewController, но я хочу использовать NSNotificationCenter

InfoCtrol *i = [[InfoCtrol alloc] init]; 
    i.hidesBottomBarWhenPushed = YES; 
[self.navigationController pushViewController:i animated:YES]; 

Мой Журнал:

Code executing in Thread <NSThread: 0x1fd7c7e0>{name = (null), num = 1} 

Update:

How should i remove last thread from mainThread 
+0

Всех UIKit вещи происходят на главном поток, и вы должны намеренно перейти к другому потоку, используя, например, Grand Central Dispatch, так что маловероятно, что проблема с другим вопросом. Существует метод класса в 'NSThread', называемый' isMainThread', который вы могли бы использовать для проверки. – MaxGabriel

+0

Какие контроллеры являются этими фрагментами кода? Вы должны описать, какие контроллеры у вас есть и где находится весь этот код. – rdelmar

+0

убедитесь, что 'self.navigationController' не' nil' –

ответ

0

Я не знаю, почему вы хотите использовать уведомление здесь, когда вы можете выполнить действие напрямую без проблем. Но простая вещь, которую вы можете сделать в методах уведомления, которые необходимо обновить пользовательский интерфейс, чтобы просто иметь их называют себя в основном потоке, если они уже не работают на эту тему:

-(void)myNotificationMethod:(NSNotification*)note { 
    if (![NSThread isMainThread]) { 
     [self performSelectorOnMainThread:@selector(myNotificationMethod:) 
           withObject:note 
          waitUntilDone:NO]; 
     return; 
    } 

    // ... do some UI stuff 
    InfoCtrol *i = [[InfoCtrol alloc] init]; 
    [self.navigationController pushViewController:i animated:YES]; 
} 
+0

@SeamusCambell Еще проблема, она не загружает uiviewcontroller, причина использования центра NSNotification: у меня есть информационная кнопка, знаете ли вы почему у меня есть этот null для имени ?: {name = (null), num = 1} – 2013-03-24 12:04:44

+0

'name' - это просто свойство, которое можно установить в потоках. Это не требуется, и я полагаю, что это просто удобство. Похоже, мне кажется, что 'self.navigationController' является' nil' здесь по какой-то причине. –

+0

Я забыл сказать одно, когда я вызываю класс обычным способом. У меня есть элемент табуляции, на мой взгляд, что я скрою их. Это означает, что таблетка выглядит по моему мнению, но с NSSnotificationCenter представление не может прийти – 2013-03-25 08:39:37

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