iPhone SDK - Уведомление запускается несколько раз и помещает несколько представлений в стек - PullRequest
1 голос
/ 10 декабря 2010

Хорошо, так что это на самом деле решено - но я не понимаю, почему то, что я сделал, сработало.

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

пользователь нажимает кнопку на панели инструментов, от делегата отправляется уведомление

mapItem = [[UIBarButtonItem alloc] initWithImage:mapImage style: UIBarButtonItemStylePlain target:self action:@selector(mapButtonPressed:)];

-(void)mapButtonPressed:(id)sender{
    NSLog(@"Map Button Pressed");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"mapButtonPressed" object:nil ] ;
}

, при этом в текущем представлении запускается функция, выдвигающая вид карты настек.

-(void)openListMap:(NSNotification *)aNotification {

    mapViewController = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];

    NSLog(@"Map Created");

    mapViewController.searchLocation = searchLocation;
    if(givenLocationType == @"input"){
        mapViewController.inputLocationText = inputLocationText;
    }
    mapViewController.givenLocationType = givenLocationType;

    CultureNOWAppDelegate *delegate =
    [[UIApplication sharedApplication] delegate];
    [delegate.navigationController pushViewController:mapViewController
                                      animated:YES];

}

Теперь это работает, я изменил последнюю строку с:

CultureNOWAppDelegate *delegate =
    [[UIApplication sharedApplication] delegate];
    [delegate.navigationController pushViewController:mapViewController
                                      animated:YES];

на:

[self.navigationController pushViewController:mapViewController animated:YES];

В результате, хотя openListMap функция по-прежнему срабатывает несколько раз (вы можете видеть в консоли, что в выводе журнала отображается «Карта создана» при каждом появлении представления с момента запуска приложения), она только помещает в стек новейший mapView.

Но почему?Во-первых, почему он запускался несколько раз, и почему он остановился, обмениваясь двумя частями кода, которые для всех намерений и целей одинаковы?

Спасибо за любые мысли.

1 Ответ

5 голосов
/ 11 декабря 2010

Тот факт, что он запускается 2 раза, предупреждает меня о том, что ваше "исправление" на самом деле не является исправлением - это поведение API Apple, которое делает то, что вы хотите.

У меня была похожая проблема с приложением, когда по необъяснимым причинам дважды запускалось уведомление. Позже я понял, что уведомление вызывается только один раз - но внутри NSNotificationCenter нет ничего, что могло бы помешать вам зарегистрировать ДВЕ наблюдателя для точно такого же события для точно такого же обратного вызова селектора.

Это произошло с нами, потому что мы добавили наблюдателей в viewDidLoad, но никогда не удаляли наблюдателей в viewDidUnload. Затем, когда у телефона пользователя было мало памяти (что, благодаря Apple, часто происходит в iOS4 +), представления сбрасываются, и вы получаете 2 наблюдателя при повторном вызове viewDidLoad.

Возможно, это не ваша проблема, но я хотел бы услышать о том, где вы регистрируетесь для уведомлений наблюдателей.

...