проблема pushViewController - PullRequest
       5

проблема pushViewController

1 голос
/ 04 августа 2011

У меня есть приложение TabBar и 2 просмотра.Одним из представлений является MKMapView с аннотациями, выносками и т. Д. Все работает хорошо.Нажатие на кнопку «UIButtonTypeDetailDisclosure» в сноске вызывает мою функцию «showDetails» (NSLOG ..).Теперь я хочу поместить DetailView в «showDetails».Я должен был бы использовать pushViewController или presentModalViewController

#pragma mark - MKMap methods
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{

    if([annotation isKindOfClass:[CustomPlacemark class]])
    {
        MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:[annotation title]];
        newAnnotation.pinColor = MKPinAnnotationColorGreen;
        newAnnotation.animatesDrop = YES; 
        newAnnotation.canShowCallout = YES;
        newAnnotation.enabled = YES;
        //newAnnotation.pinColor=MKPinAnnotationColorPurple;


        NSLog(@"Created annotation at: %f %f", ((CustomPlacemark*)annotation).coordinate.latitude, ((CustomPlacemark*)annotation).coordinate.longitude);

        [newAnnotation addObserver:self
                        forKeyPath:@"selected"
                           options:NSKeyValueObservingOptionNew
                           context:@"GMAP_ANNOTATION_SELECTED"];


        UIImageView *leftIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"leftIconView.png"]];
        newAnnotation.leftCalloutAccessoryView = leftIconView;
        [leftIconView release];

        UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton setTitle:annotation.title forState:UIControlStateNormal];
        [rightButton addTarget:self
                        action:@selector(showDetails:)
              forControlEvents:UIControlEventTouchUpInside];
        newAnnotation.rightCalloutAccessoryView = rightButton;


        [newAnnotation autorelease];

        return newAnnotation;
    }

    return nil;
}


- (void) showDetails:(id)sender {

    NSLog(@"Annotation Click");

    [self.navigationController pushViewController:self.detailViewController animated:YES];
    // I want to push a new View here...


}

К сожалению, это ничего не делает (без ошибок / без действий).Я считаю, это потому, что у меня нет navigationController для использования pushViewController.

- (void) showDetails:(id)sender {

    NSLog(@"Annotation Click");

    [self.navigationController pushViewController:self.detailViewController animated:YES];
    // I want to push a new View here...


}

Я пытаюсь создать и выдвинуть DetailViewController в navigationController, когда нажимается моя кнопка UIButtonTypeDetailDisclosure в уведомлении,но navigationController равен нулю. Есть идеи, что добавить в мою функцию 'showDetails'?

Очень ценится

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Вам необходимо иметь навигационный контроллер, прежде чем выдвигать на него представления:

DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];

// this line calls the viewDidLoad method of detailController
detailController.view.hidden = NO;

UINavigationController *navigationController = [[UINavigationController alloc] detailController];
navigationController.navigationBarHidden = YES;
[navigationController setView:detailController.view];

[self.view addSubview:navigationController.view];
[detailController release];
[navigationController release];

Будьте осторожны, это будет снова и снова инициализировать navigationController, если вы сделаете это в вашем showDetails:.Таким образом, вам нужно инициализировать ваш контроллер навигации, например, в.viewDidLoad, и тогда вы сможете вставить на него свой detailController

0 голосов
/ 04 августа 2011

Если вы хотите нажать контроллер вида с контроллером навигации, то ваш начальный вид должен быть внутри контроллера навигации для начала.

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

Вот как вы могли бы сделать что-то подобное в своем приложении: DidFinishLaunchingWithOptions: method

FirstViewController *fvc = [[FirstViewController alloc] init];
SecondViewController *svc = [[SecondViewController alloc] init];

UITabBarController *tabcon = [[UITabBarController alloc] init];
tabcon.viewControllers = [NSArray arrayWithObjects:fvc,svc,nil];

UINavigationController *navcon = [[UINavigationController alloc] initWithRootViewController:tabcon];

[self.window addSubview:navcon.view];

Затем, когда вы хотите выдвинуть контроллер подробного просмотра, вы просто звоните:

DetailViewController *dvc = [[DetailViewController alloc] init];
[self.navigationController pushViewController:dvc];

Если вы установили свои контроллеры представления в качестве свойств, вы можете вызвать self.viewControllerName, просто убедитесь, что вы также выделяете для них память. Внедрение вашего контроллера панели вкладок в контроллер навигации, подобный этому, дает вам все оформление окна (кнопки назад, строку заголовка и т. Д.) Бесплатно, и оно будет адаптироваться к вашим различным представлениям, когда они появляются на экране.

...