1

私はTabBarアプリケーションと2つのビューを持っています。 1つのビューは、アノテーションとコールアウトなどを含むMKMapViewです。すべて正常に動作します。コールアウトの 'UIButtonTypeDetailDisclosure'ボタンをクリックすると、私の 'showDetails'関数が起動します(NSLOG ..)。 今、 'showDetails'でDetailViewをプッシュしたいと思います。私は残念ながら、これは何も(エラーなし/なしアクション)を行いませんpushViewControllerまたはpresentModalViewControllerpushViewController issue

#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を持っていないためだと思う。私が作成し、通知の中の私の「UIButtonTypeDetailDisclosure」ボタンをクリックしたときにnavigationControllerにDetailViewControllerをプッシュしようとしています

- (void) showDetails:(id)sender { 

    NSLog(@"Annotation Click"); 

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


} 

。しかし、navigationControllerは無しです。 私の 'showDetails'関数に何を追加すればいいですか?

感謝

答えて

0

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を初期化します注意してください。したがって、たとえば、ナビゲーションコントローラを初期化する必要があります。 viewDidLoadをクリックしてdetailControllerをプッシュすることができます

+0

ありがとう、私はこれを試みたが、それは私のために働かない。警告:「no -detailController」メソッドが見つかりました と警告: 'UINavigationController'が '-detailController'に応答しない可能性があります... – Jan

+0

なぜこの: 'UINavigationController * navigationController = [[UINavigationController alloc] detailController] ; '? ** 'initWithRootViewController' **または何かが必要です。 – WrightsCS

+0

私はコードを編集しました。それは '[navigationController setView:detailController.view];'であるはずです。すみません、私の間違いです –

0

あなたはナビゲーションコントローラとビューコントローラをプッシュしたい場合は、あなたの最初のビューは、そもそもナビゲーションコントローラ内でなければなりません。

あなたの場合、あなたのタブバーコントローラはナビゲーションコントローラに入れられているはずです。次に、上で行ったようにshowDetailsメソッドを呼び出すことができます。それがnavコントローラにあれば、それを行う場所にコードを投稿することができ、私はもっと助けてもらうことができます。ここで

はあなた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を呼び出すことができます。ただ、それらのメモリも割り当てていることを確認してください。このようなナビゲーションコントローラにタブバーコントローラを組み込むことで、すべてのウィンドウドレッシング(バックボタン、タイトルバーなど)が無料で提供され、画面上に表示されるように異なるビューに適応します。あなたはそれについての意見をプッシュする前に、ナビゲーションコントローラを持っている必要があります

+0

どうすればいいですか? Ta – Jan

+0

@Jan例としていくつかのコードを追加しました。お役に立てれば。 – Jamie

関連する問題