iPhone編程規(guī)則是: 一個(gè)窗口,多個(gè)視圖 。UIView是iPhone屏幕上很多控件的基礎(chǔ)類(lèi)。每個(gè)iPhone用戶(hù)界面都是由顯示在UIWindow(這其實(shí)也是個(gè)特殊的UIView)內(nèi)的眾多UIView及其專(zhuān)門(mén)化子類(lèi)構(gòu)建的。
顯示數(shù)據(jù)的視圖:
- UITextView
- UILabel
- UIImageView
- UIWebView
- MKMapViews
- UIScrollView
可選擇的視圖 (以下兩個(gè)視圖類(lèi)實(shí)例都是模態(tài)顯示的) :
- UIAlertView
- UIActionSheet?
所有控件 (控件是將用戶(hù)觸摸轉(zhuǎn)換為回調(diào)觸發(fā)器的屏幕對(duì)象。) :
- UIButton
- UISegmentedControl
- UISwitch
- UISlider
- UIPageControl
- UITextField
表格和拾取器:
- UITableView (對(duì)于表格的行有一個(gè)UITableViewCell類(lèi)的表格單元項(xiàng))
- UIPickerView
各種欄樣式:
- UINavigationBar (對(duì)于導(dǎo)航欄有一個(gè)UINavigationItem類(lèi)的導(dǎo)航項(xiàng))
- UITabBar
- UISearchBar
- UIToolBar
在所有iPhone欄樣式視圖中,只有UIToolBar類(lèi)可以直接使用。其它三個(gè)都是通過(guò)對(duì)應(yīng)的控制器類(lèi)來(lái)完成工作,而不是直接構(gòu)建和管理視圖。?
進(jìn)度與活動(dòng):
- UIActivityIndicatorView
- UIProgressView?
?
?
控制器類(lèi)
?
UIViewController類(lèi)
? ? ? UIViewController負(fù)責(zé)創(chuàng)建其管理的視圖及在低內(nèi)存的時(shí)候?qū)⑺鼈儚膬?nèi)存中移除。還為標(biāo)準(zhǔn)的系統(tǒng)行為進(jìn)行響應(yīng)。從語(yǔ)法上說(shuō),UIViewController是視圖控制器的父類(lèi)。視圖控制器類(lèi)是沒(méi)有可視化表示的抽象類(lèi),只有它管理的視圖才提供可視畫(huà)布。記住:1. 視窗UIWindow雖然也是UIView,但不能用處理普通UIView的方式來(lái)設(shè)置; 2. UIView視圖使用initWithFrame:初始化,而其UIViewController則使用init類(lèi)方法直接初始化。3. UIViewController實(shí)例負(fù)責(zé)設(shè)置視圖的外觀和它顯示的子視圖。
?
UINavigationController類(lèi)
1. 導(dǎo)航控制器使用內(nèi)置動(dòng)畫(huà)在視圖之間切換; 2. 導(dǎo)航控制器自動(dòng)構(gòu)建并處理Back按鈕; 3. 導(dǎo)航控制器提供簡(jiǎn)單的菜單欄可幫助用戶(hù)進(jìn)行自定義控件。4. 每一個(gè)導(dǎo)航控制器都擁有一個(gè)根視圖控制器RootViewController,它是“導(dǎo)航彈出棧”的基礎(chǔ),是根。5. 通過(guò)調(diào)用initWithRootViewController:方法可以將特定控制器設(shè)置為根。如常見(jiàn)的:
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[[MyViewController alloc] init]]; [window addSubview:nav.view];?
?
UINavigationController如何推入和彈出視圖控制器?
?
1. 使用 pushViewController: animated: 可推入一個(gè)新的控制器,從而增加新的項(xiàng)到導(dǎo)航棧。(記住:導(dǎo)航欄控制器不添加一個(gè)視圖進(jìn)去,這個(gè)導(dǎo)航欄是沒(méi)有意義的!)
//創(chuàng)建一個(gè)導(dǎo)航控制器 UINavigationController *aNav = [[UINavigationController alloc] init]; //創(chuàng)建一個(gè)要被推入的視圖控制器,然后添加此視圖控制器到導(dǎo)航欄并予以顯示 UIViewController *aView = [[UIViewController alloc] initWithNibName:(*xib文件名*)]; [aNav pushViewController:aView animated:NO]; //這里假定是導(dǎo)航欄的第一個(gè)視圖,所以不要?jiǎng)赢?huà)化。?
推入時(shí),新的視圖控制器從右方滑入屏幕(假定animated:YES)。向左指的Back后退按鈕出現(xiàn),可返回到上一步,且Back按鈕用的是上一個(gè)視圖控制器的標(biāo)題。
2. 作為彈出回上一級(jí)視圖控制器的Back按鈕是自動(dòng)產(chǎn)生并處理的,無(wú)需用戶(hù)干預(yù)。
3. 可使用 popViewControllerAnimated:BOOL 彈出當(dāng)前視圖控制器并向左顯示前一個(gè)視圖。
4. 可使用 popToViewController: animated: 彈出到指定的視圖控制器,即不一定是上一個(gè)。
5. 可使用 popToRootViewControllerAnimated:BOOL 直接彈出到根視圖控制器。
6. 設(shè)置導(dǎo)航欄的按鈕并不是去設(shè)置導(dǎo)航欄本身。一切都是在被推入的UIViewController子類(lèi)內(nèi)部執(zhí)行推入請(qǐng)求和相關(guān)導(dǎo)航欄的定制(如:右鍵按鈕)。
?
導(dǎo)航欄可以通過(guò)直接訪(fǎng)問(wèn) navigationBar 屬性,改變欄的風(fēng)格或者它的顏色:
self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
?
提示:UIViewController 有一個(gè)屬性是navigationController,如果當(dāng)前ViewController在某個(gè)NavigationController的堆棧中 的話(huà)(即是被推送過(guò)來(lái)的),則視圖控制器的這個(gè)屬性就指向那個(gè)NavigationController,否則為nil。
?
要添加或修改導(dǎo)航欄按鈕,使用UINavigationItem抽象類(lèi)。其描述了導(dǎo)航欄上顯示的內(nèi)容,而正好UIViewController另有一導(dǎo)航項(xiàng)屬性 navigationItem 包括左欄按鈕( leftBarButtonItem )、右欄按鈕( rightBarButtonItem )和欄標(biāo)題( title )、用于顯示標(biāo)題的視圖(titleView),以及用于從當(dāng)前視圖向后導(dǎo)航的Back按鈕( backBarButtonItem )和隱藏后退按鈕( hidesBackButton )。
?
注意:對(duì)于導(dǎo)航欄定制,對(duì)定制實(shí)際標(biāo)題的最簡(jiǎn)單方式時(shí)使用子視圖控制器而不是導(dǎo)航項(xiàng)的title屬性:
self.title = @"Hello"; self.title = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; //可使標(biāo)題自動(dòng)反映運(yùn)行的應(yīng)用程序名稱(chēng)?
?導(dǎo)航控制器加載模態(tài)視圖控制器:
?通常情況下,模態(tài)視圖控制器用于選取數(shù)據(jù)。在發(fā)送 presentModalViewController: animated: 消息后,一個(gè)新的視圖控制器(其實(shí)是個(gè)ModalViewController)會(huì)滑動(dòng)到屏幕并掌握控制權(quán),直到使用 dismissModalViewControllerAnimated: 將它隱藏才重新得到控制權(quán)。
?
對(duì)于導(dǎo)航控制器來(lái)說(shuō),viewWillAppear方法是沒(méi)有結(jié)果的,要實(shí)現(xiàn)UINavigationControllerDelegate委托方法willShowViewController: animated:達(dá)到目的。
?
UITabBarController類(lèi)
? ? ? 選項(xiàng)卡類(lèi)允許用戶(hù)在多個(gè)視圖控制器之間移動(dòng)并在屏幕的底部可定制該欄。向不同的視圖同時(shí)提供一次單擊訪(fǎng)問(wèn),向用戶(hù)選擇的屏幕和編輯底欄的屏幕同時(shí)提供More按鈕。
? ? ? 選項(xiàng)卡類(lèi)的方便之處就是
不需要象導(dǎo)航欄那樣以棧的方式推入和彈出視圖的操作
,而是組建一系列的控制器(它們各自可以是UIViewController、UINavigationController、UITableViewController或其他任何類(lèi)型的視圖控制器),并通過(guò)設(shè)置欄的
viewControllers屬性
將其添加到選項(xiàng)卡欄,使每個(gè)選項(xiàng)卡對(duì)應(yīng)一個(gè)試圖控制器。
一、創(chuàng)建UITabBarController
-
常見(jiàn)的在應(yīng)用程序委托類(lèi)的applicationDidFinishLaunching:方法中創(chuàng)建,這通常可為應(yīng)用窗口提供根視圖。
// 創(chuàng)建一個(gè)UITabBarController對(duì)象 UITabBarController *tabBarController = [[UITabBarController alloc] init]; // tabBarController.delegate = self; // 創(chuàng)建一系列要添加到每個(gè)具體Tab卡的視圖控制器 MyViewController *vc1 = [[MyViewController alloc] init]; MyOtherViewController *vc2 = [[MyViewController alloc] init]; // 將創(chuàng)建好的這些視圖控制器先添加到一個(gè)Array對(duì)象中,再將此數(shù)組分配給Tab Bar Controller的viewControllers屬性 NSArray *controllers = [NSArray arrayWithObjects:vc1,vc2,nil]; tabBarControllers.viewControllers = controllers; /* 也或者 NSMutableArray *controllers =[[NSMutableArray alloc] initWithCapacity:2]; [controllers addObject:vc1]; [controllers addObject:vc2]; */ // 將TabBar控制器的當(dāng)前視圖添加到窗口 [window addSubview:tabBarController.view];
-
在實(shí)現(xiàn)UITabBarControllerDelegate委托的視圖控制器中
重寫(xiě)init方法
來(lái)自定義UITabBarItem條目。
代碼一 是由initWithNibName:方法來(lái)加載具體的某個(gè)視圖控制器并自定義該控制器中TabBarItem樣式外觀等。
- (id)init { if(self = [super initWithNibName:@"MyViewController" bundle:nil]) { self.title = @"My View Controller"; UIImage *anImage = [UIImage imageNamed:@"MyImage.png"]; UITabBarItem *theItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:anImage tag:0]; self.tabBarItem = theItem; [theItem release]; } return self; }
? 代碼二 我們也可以直接在具體的視圖控制器內(nèi)部重寫(xiě)init方法。- (id)init { if([super init] != nil) { UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Home" image:[UIImage imageNamed:@"MyImage.png"] tag:0]; self.tabBarItem = item; [item release]; } return self; }
-
實(shí)現(xiàn)所需的委托方法,以讓UITabBarController能夠正常觸發(fā)這些回調(diào)方法。
tabBarController:didSelectViewController: 是當(dāng)用戶(hù)選擇一個(gè)新的選項(xiàng)卡時(shí),控制器會(huì)發(fā)送這個(gè)消息。
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { // 捕捉selectedIndex,可確定當(dāng)前所選選項(xiàng)卡 NSNumber *tabNumber = [NSNumber numberWithInt:[tabBarController selectedIndex]]; // 使用iPhone內(nèi)置用戶(hù)默認(rèn)系統(tǒng)NSUserDefaults,利用setObject:forKey:為關(guān)鍵字設(shè)定值 [[NSUserDefaults standardUserDefaults] setObject:tabNumber forKey:@"selectedTab"]; [[NSUserDefaults standardUserDefaults] synchronize]; // 選項(xiàng)卡圖標(biāo)項(xiàng)右上角紅色小紅圈數(shù)字提示 viewController.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d",80]; }
?
來(lái)源: http://www.cnblogs.com/lovecode/archive/2012/01/03/2310866.html
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
