photo credit: ak_tokyo via photopin cc
Good evening, this is Bono.
I'm slowly getting used to creating iPhone apps that don't use Interface Builder or Story Board. There are still a lot of "why do we need this? There are still a lot of codes that are like, "Why do we need this?
Incidentally, this time I wanted to create an application that combines TabBar and NavigationBar.
When I googled, I found many sites that implemented NavigationBar or TabBar with just code, but I could find few that implemented these in combination.
Leave it for future use.
Prepared classes
Prepare the following 6 pieces.
- AppDelegate: Overall management
- MainViewController: Tab screen Main
- SubViewController: Tab screen Sub
- SetViewController: Navigation screen Top
- Item1ViewController: Navigation screen hierarchy 1
- Item2ViewController: Navigation screen hierarchy 2
The tree looks like this.
Completion image
Tab screen Main
Tab screen Sub ( = Navigation screen Top)
Navigation screen hierarchy 1
Navigation screen hierarchy 2
Code to achieve
Feel free to use the code below as a template.
Incidentally, the operation has been confirmed with the combination of Xcode 5.0 and iOS7.
AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
UIWindow *window;
}
@property (strong, nonatomic) UIWindow *window;
AppDelegate.m
#import "AppDelegate.h"
#import "MainViewController.h"
#import "SubViewController.h"
@implementation AppDelegate
@synthesize window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
window.backgroundColor = [UIColor redColor];
UITabBarController *rootController = [[UITabBarController alloc]init];
MainViewController *mainViewController = [[MainViewController alloc]initWithNibName:nil bundle:nil];
SubViewController *subViewcontroller = [[SubViewController alloc]initWithNibName:nil bundle:nil];
rootController.viewControllers = [NSArray arrayWithObjects:mainViewController, subViewcontroller, nil];
mainViewController.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"メイン" image:nil selectedImage:nil];
subViewcontroller.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"設定" image:nil selectedImage:nil];
rootController.selectedIndex = 0;
[window setRootViewController:rootController];
[window makeKeyAndVisible];
return YES;
}
MainViewController.h
#import <UIKit/UIKit.h>
@interface MainViewController : UIViewController
@end
MainViewController.m
#import "MainViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//ツールバーの表示
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 200, 100)];
label.text = @"メイン画面";
[self.view addSubview:label];
}
return self;
}
@end
SubViewController.h
#import <UIKit/UIKit.h>
@interface SubViewController : UIViewController {
UIViewController *rootController;
}
@property (strong, nonatomic) UIWindow *window;
@end
SubViewController.m
#import "SubViewController.h"
#import "SetViewController.h"
@interface SubViewController ()
@end
@implementation SubViewController
@synthesize window;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
SetViewController *setViewController = [[SetViewController alloc]init];
rootController = [[UINavigationController alloc]initWithRootViewController:setViewController];
[self.view addSubview:rootController.view];
}
return self;
}
@end
SetViewController.h
#import <UIKit/UIKit.h>
@interface SetViewController : UITableViewController {
@private NSMutableArray *items;
}
@end
SetViewController.m
#import "SetViewController.h"
@interface SetViewController ()
@end
@implementation SetViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
self.title = @"設定画面";
items = [NSMutableArray arrayWithObjects:@"Item1ViewController",@"Item2ViewController", nil];
return self;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [items count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(nil==cell){
cell = [[UITableViewCell alloc]initWithFrame:CGRectZero reuseIdentifier:cellIdentifier];
}
cell.textLabel.text = [items objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Class class = NSClassFromString([items objectAtIndex:indexPath.row]);
id viewController = [[class alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
}
Item1ViewController.h
Item1ViewController and Item2ViewController2 are similar, so 1 is listed as a representative.
#import <UIKit/UIKit.h>
@interface Item1ViewController : UIViewController
@end
Item1ViewController.m
#import "Item1ViewController.h"
@interface Item1ViewController ()
@end
@implementation Item1ViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
self.view.backgroundColor = [UIColor blueColor];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 200, 100)];
label.text = @"item1";
[self.view addSubview:label];
}
return self;
}
Now it's done.
Screen transitions are the first hurdle in creating an iPhone application.
I had quite a bit of trouble with it myself, but I'm getting much better at moving it the way I want to.
Although the following book is intended for intermediate level users, it was very useful in deepening my understanding of screen transitions and ViewController.
The code is a bit old, published in 2010, but it is probably the one and only book at this time that explains these principles from the ground up.
It is sufficiently current.