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

У меня есть 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 в этом отношении) появляется, но является пустым / полностью белым. Кто-нибудь понимает, почему я не вижу карты при попытке переключиться в режим просмотра карты?


person Scott Berrevoets    schedule 16.05.2011    source источник


Ответы (1)


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

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

person FKDev    schedule 16.05.2011
comment
Я добавил это, и теперь он говорит мне, что кадр mapView равен 320 на 460, так что это правильно. Кроме того, он указал, что объект не скрыт, что заставляет меня думать, что mapView не был (правильно) добавлен в subview, поэтому экран белый только потому, что tableView был скрыт, а не потому, что вид карты белый. [self.view addSubview:mapView] кажется мне правильным .. - person Scott Berrevoets; 16.05.2011
comment
Что бы я сделал сейчас, так это записал бы self.view и все его subviews. для (UIView * просмотр в self.view.subviews) NSLog (@% @, просмотр); Другой метод отладки для представлений - это изменение backgroundColor, чтобы на самом деле увидеть, где находятся представления. - person FKDev; 17.05.2011
comment
В любом случае не стоит так делать. Вы должны создать контроллер представления для своей карты и использовать либо pushViewController, либо presentModalController. - person FKDev; 17.05.2011
comment
Я подумал, что это, наверное, проще, поэтому и сделал. Сейчас он работает нормально, но я использую addSubview и устанавливаю для свойства hidden значение YES или NO в зависимости от того, какое представление выбрал пользователь. Есть ли в этом (производительность) положительные или отрицательные стороны › - person Scott Berrevoets; 17.05.2011
comment
Speedwise Я так не думаю. Но у вас может быть проблема с процессом предупреждения памяти. Вы получаете одно предупреждение о памяти на каждый контроллер представления, это позволяет вам освобождать представления, когда памяти становится мало. Если у вас есть все ваши представления в контроллерах одного представления, вам может быть сложно освободить неиспользуемые представления. - person FKDev; 17.05.2011