Objective-C для чайников: как заставить делегата приложения общаться с контроллерами? - PullRequest
0 голосов
/ 21 марта 2011

как я могу вызывать методы в моих контроллерах из делегата приложения. Например, мое приложение использует делегат приложения для мониторинга местоположения пользователя. После того, как местоположение было определено, я хочу вызвать метод на контроллере, на котором есть MKMapView, и показать местоположение пользователя на нем. Как я могу это сделать?

Вот мой текущий код:

//  AppDelegate.m
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [[[DashboardViewController alloc] initWithNibName:@"DashboardViewController" bundle:nil] displayMyLocation:newLocation.coordinate];
}

Также пробовал это, который сбой с SIGABRT, но по крайней мере пытается вызвать метод:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [(DashboardViewController *)dashboardViewController displayMyLocation:manager];
}

В качестве альтернативы, теперь, когда я думаю об этом, было бы неправильно, если бы контроллер также контролировал местоположение пользователя и просто сам вызывал его методы? Если я правильно помню, несколько делегатов CLLocationManagerDelegate не повлияли на производительность, потому что все они имеют одинаковый доступ к GPS? Это правильно или неправильно? Просто кажется глупым иметь несколько экземпляров одного и того же ...

Заранее спасибо!

ОБНОВЛЕНИЕ для @ nevan

Код карты:

- (void)displayMyLocation:(CLLocation *)location {
    MKCoordinateSpan span;
    MKCoordinateRegion region;

    span.latitudeDelta = 0.02;
    span.longitudeDelta = 0.02;

    region.center = location.coordinate;
    region.span = span;

    [map setRegion:region];
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Было бы неплохо, если бы ваш контроллер отслеживал события местоположения.

Довольно приличной альтернативой было бы использование центра уведомлений для уведомления контроллера о том, что доступно новое местоположение. Я действительно сделал именно это в одном из моих приложений. Изучите строку 70 этого файла, чтобы узнать, как отправить уведомление и , строку 54 этого файла, чтобы узнать, как подписаться на эти уведомления .

1 голос
/ 21 марта 2011

locationManager:didUpdateToLocation вызывается много раз, каждый раз, когда устройство получает новое исправление для местоположения, так что вы в конечном итоге будете назначать и запускать ваш DashboardViewController много раз. Правильный способ сделать это - выделить и инициировать переменную экземпляра dashboardViewController при настройке делегата приложения, а затем использовать эту переменную экземпляра. Похоже, вы сделали это во втором фрагменте кода, но я не понимаю, почему вы должны привести его к DashboardViewController.

Было бы лучше снова поместить диспетчер местоположений в то же место, что и вид карты. Почему бы не переместиться туда locationManager:didUpdateToLocation?

...