Пустой MKMapView при переключении с UITableView

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня есть UITableView в UINavigationController, который содержит rightBarButtonItem, который должен скрывать UITableView и вместо этого показывать MKMapView. Кнопка, похоже, отлично работает: она скрывает UITableView и показывает MKMapView. Однако этот MKMapView пуст. Как и в, полностью белый. Я пытался использовать UILabel (только для целей тестирования), и это тоже не отображается, поэтому проблема, должно быть, возникает при добавлении MKMapView (и UILabel) в иерархию представлений. Некоторый соответствующий код:

 - (void)viewDidLoad {
    [super viewDidLoad];

    self.mapView = [[MKMapView alloc] init];
    mapView.hidden = YES;

    [self.view addSubview:self.mapView];

    // Some other stuff, table set up, etc.
}
  

Это viewDidLoad класса, который наследуется от UITableViewController. Теперь я использую следующий метод, который вызывается при нажатии на rightBarButtonItem UINavigationController:

 - (void) toggleView {

    if (self.mapView.isHidden) {

        self.mapView.hidden = NO;
        self.tableView.hidden = YES;
        self.viewButton.title = @"List";
    }

    else {

        self.mapView.hidden = YES;
        self.tableView.hidden = NO;
        self.viewButton.title = @"Map";
    }

}
  

Я уверен, что функция вызывается, я проверил с помощью NSLog. Кроме того, UITableView корректно исчезает, и, я полагаю, MKMapView (или любой другой объект UIView, если на то пошло) появляется, но пустой / полностью белый. Кто-нибудь понимает, почему я не вижу карты при попытке переключиться на просмотр карты?

Ответ №1:

Вы должны задать ему размер и положение.
Размер CGSize = self.view.frame.size;
self.MapView =[[MKMapView alloc] initWithFrame:CGRectMake(0,0, size.width, size.height)];

Чтобы проверить размер в консоли, добавьте следующую строку в свой метод toogleview:
NSLog(@»%@», self.MapView);

Комментарии:

1. Я добавил это, и теперь он сообщает мне, что размер кадра mapView составляет 320 на 460, так что это правильно. Кроме того, это указывало, что объект не скрыт, что заставляет меня думать, что MapView не был (правильно) добавлен в подпредставление, поэтому экран белый только потому, что TableView был скрыт, а не потому, что вид карты белый. [self.view addSubview:mapView] хотя для меня это выглядит правильно..

2. Что бы я сейчас сделал, так это зарегистрировал self.view и все его подвиды. для (UIView * просмотр в self.view.subviews) NSLog (@»% @», view); Другой метод отладки для представлений — изменение backgroundColor, чтобы действительно видеть, где находятся представления.

3. В любом случае вы не должны так это делать. Вы должны создать контроллер просмотра для своей карты и использовать либо pushViewController, либо presentModalController.

4. Я подумал, что это, вероятно, проще, поэтому я так и сделал. Сейчас это работает нормально, но я использую addSubview и устанавливаю hidden свойству значение YES или NO в зависимости от того, какой вид выбрал пользователь. Есть ли у этого какие-либо преимущества (в производительности) или недостатки>

5. По скорости я так не думаю. Но у вас может возникнуть проблема с процессом предупреждения о памяти. Вы получаете одно предупреждение о памяти на контроллер просмотра, это позволяет вам освобождать просмотры, когда памяти становится мало. Если у вас есть все ваши представления в одном контроллере просмотра, вам может быть трудно освободить неиспользуемые представления.