首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pushViewController问题

pushViewController问题
EN

Stack Overflow用户
提问于 2011-08-04 14:30:13
回答 2查看 1.7K关注 0票数 1

我有一个TabBar应用程序和两个视图。一个视图是一个带有注释和标注等的MKMapView,所有这些都运行良好。单击标注中的'UIButtonTypeDetailDisclosure‘按钮,我的'showDetails’函数将触发(NSLOG..)。现在我想在“showDetails”中推送一个DetailView。我必须使用pushViewControllerpresentModalViewController

代码语言:javascript
复制
#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...


}

不幸的是,这并不能做任何事情(无错误/无操作)。我想这是因为我没有使用pushViewControllernavigationController

代码语言:javascript
复制
- (void) showDetails:(id)sender {

    NSLog(@"Annotation Click");

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


}

当我在通知中的'UIButtonTypeDetailDisclosure‘按钮被点击时,我正试图在navigationController中创建并推送一个DetailViewController。但是navigationController不知道要在我的'showDetails‘函数中添加什么?

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-04 15:51:04

在将视图推送到导航控制器之前,您需要有一个导航控制器:

代码语言:javascript
复制
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];

请注意,如果您在showDetails:中执行此操作,则会一次又一次地初始化navigationController。所以你需要在eg中初始化导航控制器。viewDidLoad,然后你就可以把你的detailController推到它上面

票数 0
EN

Stack Overflow用户

发布于 2011-08-04 14:41:52

如果您希望使用导航控制器推送视图控制器,则初始视图必须首先位于导航控制器中。

在您的例子中,您的选项卡栏控制器可能应该放在导航控制器中,如果它还没有的话。然后,您可以像上面那样调用showDetails方法。如果它在导航控制器中,也许你可以将代码发布在你这样做的地方,我可以尝试并提供更多的帮助。

下面是如何在您的applicationDidFinishLaunchingWithOptions:方法中执行类似操作

代码语言:javascript
复制
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];

然后,当你想要推送一个细节视图控制器时,你只需调用:

代码语言:javascript
复制
DetailViewController *dvc = [[DetailViewController alloc] init];
[self.navigationController pushViewController:dvc];

如果您将视图控制器设置为属性,则可以调用self.viewControllerName,但要确保您也为它们分配了内存。将选项卡栏控制器嵌入到导航控制器中,就可以完成所有的窗口修饰(后退按钮、标题栏等)。免费,它将适应您的不同视图,因为它们出现在屏幕上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6937074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档