7

私はiOS開発にまったく慣れていないので、行き詰まっています。現在、1 つのタブ コントローラーを使用して、2 つのビュー コントローラー (リスト ビューとマップ ビュー) を切り替えています。これにより、ストーリーボードを使用して 2 つのビューの外観を簡単に構成できるようになりました。

現在、要件が変更されており、アプリには、クリックするとリスト ビューまたはマップ ビューのいずれかを表示するセグメント化されたコントロールを備えた 1 つのビュー コントローラーが必要です。これを行うには、リスト/マップ ビューを表示できるビュー コントローラーを 1 つ作成する必要があります。

セグメント化されたコントローラーの部分がどのように機能するかは理解していますが、2 つのビューを同じ領域に表示する方法に固執しています。1 つのビュー コントローラーで 2 つのビューを使用するにはどうすればよいですか (可能であれば、ストーリーボードを使用します)。

前もって感謝します!

4

3 に答える 3

10

1 つのビュー コントローラーに 2 つのメイン ビューを含めるのではなく、表示するビューごとに 1 つのビュー コントローラーを作成する必要があります。ただし、単一のView Controllerに複数のサブビューを含めることができます。これは、あなたにとってうまくいくかもしれません。

この問題を解決するにはいくつかの方法があります。正しい方法は、コンテナー UIViewController を作成し、表示する 2 つのビューコントローラーをその子として追加することです。表示するビューコントローラーにビューを設定するだけです。しかし、あなたは iOS 開発に不慣れだと言っているので、それはおそらく非常に複雑になるでしょう。

したがって、簡単な解決策(これをストーリーボードに実装できるかどうかはわかりません-私は好きではないので)、タブを備えた単一のView Controllerと、メインビューの2つのサブビューを用意することです。その後、簡単に切り替えることができます次のようなことを行うことにより、ビュー間で:

[self.view addSubview:view1];

//切り替える

[view1 removeFromSuperview];
[self.view addSubView:view2];

または、スーパービューから削除する必要はなく、単に非表示にしてから、bringSubViewToFront必要なビューを表示するために使用します。

他のアプローチを使用したい場合は、「Implementing UIViewController Containment」というタイトルの WWDC 2011 ビデオを探すことをお勧めします。この他の質問は次の場合に役立ちます: 2 つのビューを持つ UISegmented コントロール

それが役立つことを願っています。

于 2012-08-27T17:43:53.447 に答える
4

ストーリーボード API を使用すると、2 つの viewController を切り替えることができます

 - (void)viewDidLoad {
    [super viewDidLoad];
    UIViewController *viewController = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex];
    [self addChildViewController:viewController];
    viewController.view.frame = self.contentView.bounds;
    [self.contentView addSubview:viewController.view];
    self.currentViewController = viewController;
}
- (UIViewController *)viewControllerForSegmentIndex:(NSInteger)index {
    UIViewController *viewController;
    switch (index) {
        case 0:
            viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
            break;
        case 1:
            viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
            break;
    }
    return viewController;
}
- (IBAction)segmentChanged:(UISegmentedControl *)sender {
    UIViewController *viewController = [self viewControllerForSegmentIndex:sender.selectedSegmentIndex];
    [self addChildViewController:viewController];
    [self transitionFromViewController:self.currentViewController toViewController:viewController duration:0.0 options:UIViewAnimationOptionTransitionNone animations:^{
        [self.currentViewController.view removeFromSuperview];
        viewController.view.frame = self.contentView.bounds;
        [self.contentView addSubview:viewController.view];
    } completion:^(BOOL finished) {
        [viewController didMoveToParentViewController:self];
        [self.currentViewController removeFromParentViewController];
        self.currentViewController = viewController ;
    }];
    self.navigationItem.title = viewController.title;
}

これは、RaywenderlichによるiOS チュートリアルを参照しています。お役に立てれば

于 2012-08-27T17:51:13.840 に答える
0

Storyboard ではこのようにできます。

  1. UISegmentControl と UITableView+UITableViewCell を追加した UIViewController を作成します。

セグメント コントロール付きのストーリーボード テーブルビュー

  1. ここで、MKMapView も追加する必要があります。ホバラーです。単純に MapView を ViewController に配置しようとすると、新しい TableView セルとして追加されますが、これは私たちが望んでいるものではありません。

ストーリーボード マップビューが tableviewcell として追加されました

だからこそ、そうすべきではありません。代わりに、MapView を Storyboard の ViewControllers のリストに追加する必要があります。

Stroyboard ビューコントローラー ビューに追加された MapView

  1. MapView のサイズと原点を TableView のものと同じになるように調整します。

MapView のサイズと原点の調整

  1. ここで、MapView のいずれかの TableView に対して Hidden を YES に設定し、それらのアウトレットを作成して合成します。次に、セグメント コントロールの Value Changed メソッドで切り替えを実装します。

    - (IBAction)switchView:(id)sender {
        self.theTableView.hidden = !self.theTableView.hidden;
        self.theMapView.hidden = !self.theMapView.hidden;
    
        if (!self.theTableView.hidden) {
            [self.theTableView reloadData];
        }
    }
    
于 2013-06-16T08:22:00.330 に答える