IOS 學習 開發 自定義 UINavigationController 導航

文件目錄以下:基本導航順序: root -> First -> Second -> Third。其中,FirstViewController做爲 navigation堆棧的rootviewhtml

 

一、建立navigation。post

若是是想直接把navigation導航做爲項目一開始的跟視圖,把RootViewController.h文件裏的nav屬性放到AppDelegate.h裏便可,再把RootViewController.m文件裏的action的代碼複製到 AppDelegate.m裏的didFinishLaunchingWithOptions 方法裏,最後把 self.window.rootViewController 設置 UINavigationController類型的屬性nav便可flex

在RootViewController.h文件atom

複製代碼
 1 #import <UIKit/UIKit.h>
 2 @class FirstViewController;
 3 
 4 @interface RootViewController : UIViewController
 5 
 6 @property (strong, nonatomic) UINavigationController *nav;
 7 
 8 - (IBAction)btnClick:(UIButton *)sender;
 9 
10 @end
複製代碼

 

在RootViewController.m 文件裏的隨意一個自定義action裏:spa

複製代碼
 1 - (IBAction)btnClick:(UIButton *)sender {
 2     
 3     //建立一個viewcontroller
 4     FirstViewController *fristview =[[[FirstViewController alloc] init] autorelease];
 5    
 6     
 7     //初始化UINavigationController(方式一)
 8     self.nav = [[[UINavigationController alloc] initWithRootViewController:fristview] autorelease];
 9     
10     
11     //初始化UINavigationController(方式二)
12   //  self.nav = [[[UINavigationController alloc] init] autorelease];
13   //  [self.nav pushViewController:fristview animated:YES];
14 
15     
16     //初始化UINavigationController(方式三,失敗,xib文件加載失敗,緣由暫時不明)
17    // self.nav = [[[UINavigationController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
18     
19     
20     //跳轉到FirstView頁面
21     [self presentViewController:self.nav animated:YES completion:nil];
22     
23     
24     //這種寫法通常用於往view裏添加一些小控件,如button  label textField之類的,不適宜用於頁面跳轉
25     // [self.view addSubview:self.nav.view];
26     
27     
28 }
複製代碼


二、設置viewcontroller的navigationItem屬性和 toolbar、toolbarItemcode

(1)firstViewcontroller的navigation屬性和toolbarItem屬性。代碼在firstviewcontroller.m的viewdidLoad方法裏htm

每一個viewcontroller都有一個navigationItem屬性(只在被加載到導航堆棧裏纔有效),navigationItem屬性裏又有5個屬性:UIBarButtonItem類型的leftBarButtonItem、rightBarButtonItem和backBarButtonItem,NSString類型的title(或者viewcontroller屬性的titleView)、prompt。blog

複製代碼
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     // Do any additional setup after loading the view from its nib.
 5     
 6     //下面兩句代碼的效果同樣,但貌似設置了navigationItem.title 後 title就會被不起做用了
 7     self.navigationItem.title =  @"首頁123";
 8     self.title = @"首頁";
 9     
10     //在title上面再加多一行,但這樣子就會形成導航欄的寬度變寬
11   //  self.navigationItem.prompt = @"prompt";
12     
13     //設置rightbarbuttonitem
14     UIBarButtonItem *rightbar = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(btnClick:)] autorelease];
15 
16     self.navigationItem.rightBarButtonItem = rightbar;
17 
18     //修改backbarbuttonitem的title.這個backbarbutton是顯示在下一個push進來的view的tabbar的左邊的
19     //action能夠設置爲nil,這是的動做就是默認的動做,也就是返回到這個view
20     self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStylePlain target:self action:nil] autorelease];
21     
22     
23     
24     //設置toolbar是否可見(對整個navigation堆棧裏的view起做用,起全局做用)
25     self.navigationController.toolbarHidden = NO;
26     
27     UIBarButtonItem *three = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];
28     UIBarButtonItem *four = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:nil action:nil];
29     UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
30     
31     //toolbar是整個navigation堆棧裏的view共同的,但toolbar上面的items倒是每一個view單獨擁有的
32     //如今只是設置了當前view的toolbaritem,與其餘view的toolbaritme是沒有關係的
33     [self setToolbarItems:[NSArray arrayWithObjects:flexItem, three, flexItem, four, flexItem, nil]];
34     
35     [three release];
36     [four release];
37     [flexItem release];
38    
39     
40 }
複製代碼


頁面效果以下:three

 

(2)、secondviewcontroller的navigationItem和toolbarItemget

代碼在viewdidLoad方法裏

複製代碼
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     // Do any additional setup after loading the view from its nib.
 5 
 6     //設置左右barbutton
 7     UIBarButtonItem *rightbar = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(gotoThird:)] autorelease];
 8     
 9     UIBarButtonItem *leftbar = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(gotoThird:)] autorelease];
10     
11     self.navigationItem.rightBarButtonItem = rightbar;
12     self.navigationItem.leftBarButtonItem = leftbar;
13     
14     //當前view在navigation堆棧裏不是rootview,因此把該viewpush到navigation堆棧裏時,tabbar左邊會顯示backbarbutton
15     //若是給當前view設置了leftbarbutton,會把把backbarbutton覆蓋掉,想同時顯示二者,需以下設置:
16     self.navigationItem.leftItemsSupplementBackButton = YES;
17 
18     
19     
20     //設置當前view的toolbar可見.由於有可能從一個toolbar不可見的view導航到當前view
21     self.navigationController.toolbarHidden = NO;
22     
23 }
複製代碼


效果以下:

 

(3)、thirdviewcontroller的navigationItem和toolbaritem

複製代碼
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     self.title = @"第三頁";
 5     // Do any additional setup after loading the view from its nib.
 6     
 7     //隱藏當前view的toolbar
 8     self.navigationController.toolbarHidden = YES;
 9     
10     //設置toolbar
11     UIBarButtonItem *rightbar = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(goToRootView)] autorelease];
12     
13     self.navigationItem.rightBarButtonItem = rightbar;
14     
15    // NSArray *array = @[@"排骨", @"牛排"];
16     
17     //設置titleview,會覆蓋title
18     UISegmentedControl *segment = [[[UISegmentedControl alloc] initWithItems:@[@"排骨", @"牛扒"] ] autorelease];
19     segment.segmentedControlStyle = UISegmentedControlSegmentCenter;
20     
21     self.navigationItem.titleView = segment;
22 }
複製代碼

效果以下:

 

barButtonItem的style及效果對應以下:

 
轉自:http://www.cnblogs.com/zouzf/archive/2013/01/17/2864506.html
相關文章
相關標籤/搜索