开发者

How can I use a single UIToolbar with multiple different UIViewControllers?

开发者 https://www.devze.com 2023-01-12 12:06 出处:网络
I have a simple app with two basic screens, a UIMapView and a UITableView. I\'d like to have a toolbar at the bottom with a couple of buttons and a UISegmentedControl with two segments: \"Map\" an开发

I have a simple app with two basic screens, a UIMapView and a UITableView. I'd like to have a toolbar at the bottom with a couple of buttons and a UISegmentedControl with two segments: "Map" an开发者_开发百科d "Table". (The layout is similar to the Google Maps app that ships with the iPhone.) How can I keep the same toolbar while presenting either the UIMapView (with a UIMapViewController) or the UITableView (with a UITableViewController) when the user switches back and forth on the segmented control? Of course, I can just create an identical toolbar for each of the two different views and display them separately, but is there a better way?


Write a UIViewController that manages your 2 VC's and transitions between the MKMapView and UITableView in response to the segmented control. First set up the nib for this new VC in Interface Builder: add an UISegementedControl and a simple UIView (contentView). The interface file contains references to the UI Elements and to the 2 VC's + an action to respond to the segmented control:

//
//  MapAndTableViewController.h
//  

#import <UIKit/UIKit.h>

#import "MyMapViewController.h"
#import "MyTableViewController.h"

@interface MapAndTableViewController : UIViewController {

    IBOutlet UISegmentedControl* segmentedControl;  
    IBOutlet UIView* contentView;
    UIViewController* firstVC;
    UIViewController* secondVC;
}


-(IBAction) valueChanged:(UISegmentedControl*) sender;

@end

Implementation:

//
//  MapAndTableViewController.m
//

#import "MapAndTableViewController.h"


@implementation MapAndTableViewController

-(IBAction) valueChanged:(UISegmentedControl*) sender {

    if (sender.selectedSegmentIndex == 0) {
        [UIView transitionFromView:[contentView.subviews lastObject] toView:firstVC.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft  completion:nil];
    }
    if (sender.selectedSegmentIndex == 1) {
        [UIView transitionFromView:[contentView.subviews lastObject] toView:secondVC.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft  completion:nil];
    }

}

-(void)awakeFromNib {
    firstVC = [[MyMapViewController alloc] initWithNibName:@"MyMapViewController" bundle:nil];
    secondVC = [[MyTableViewController alloc] initWithNibName:@"MyTableViewController" bundle:nil]; 

}

- (void)viewDidLoad {
    [super viewDidLoad];
    [contentView addSubview:firstVC.view];      
}

- (void)dealloc {
    [firstVC release];
    [secondVC release];
    [super dealloc];
}    

@end

In the valueChanged method you replace the current view and animate the transition.

Note that the views firstVC.view and secondVC.view are created on first access of the view-property of each VC.


you could use a single view controller, and add all of the views(UIMapView, UITableView, etc) to your view and simply show/hide the correct views upon clicking the segmented control

with such a simple app without many views, you shouldn't have a messy/clustered view controller file and can easily show/hide these 2 views.

perhaps use an animation between switching between views so it looks nice

0

精彩评论

暂无评论...
验证码 换一张
取 消