我有一个TabBar应用程序和两个视图。一个视图是一个带有注释和标注等的MKMapView,所有这些都运行良好。单击标注中的'UIButtonTypeDetailDisclosure‘按钮,我的'showDetails’函数将触发(NSLOG..)。现在我想在“showDetails”中推送一个DetailView。我必须使用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...
}不幸的是,这并不能做任何事情(无错误/无操作)。我想这是因为我没有使用pushViewController的navigationController。
- (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‘函数中添加什么?
非常感谢
发布于 2011-08-04 15:51:04
在将视图推送到导航控制器之前,您需要有一个导航控制器:
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推到它上面
发布于 2011-08-04 14:41:52
如果您希望使用导航控制器推送视图控制器,则初始视图必须首先位于导航控制器中。
在您的例子中,您的选项卡栏控制器可能应该放在导航控制器中,如果它还没有的话。然后,您可以像上面那样调用showDetails方法。如果它在导航控制器中,也许你可以将代码发布在你这样做的地方,我可以尝试并提供更多的帮助。
下面是如何在您的applicationDidFinishLaunchingWithOptions:方法中执行类似操作
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,但要确保您也为它们分配了内存。将选项卡栏控制器嵌入到导航控制器中,就可以完成所有的窗口修饰(后退按钮、标题栏等)。免费,它将适应您的不同视图,因为它们出现在屏幕上。
https://stackoverflow.com/questions/6937074
复制相似问题