日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Cocoa編程中視圖控制器與視圖類(lèi)詳解

系統(tǒng) 2038 0

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];
              
    當(dāng)然在應(yīng)用程序委托AppDelegate類(lèi)中創(chuàng)建UITabBarController,相當(dāng)于創(chuàng)建了一個(gè)基于Tab Bar的工程項(xiàng)目。不過(guò),也可以視具體情況,我們直接在一個(gè)獨(dú)立的視圖控制器中創(chuàng)建UITabBarController實(shí)例對(duì)象,如自定義一個(gè)用于視圖 切換的控制器類(lèi)ViewSwitcherViewController,就可在其中的viewDidLoad方法中創(chuàng)建所需要的 TabBarController。
  • 在實(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

?

?

?

?

Cocoa編程中視圖控制器與視圖類(lèi)詳解


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 孝感市| 高青县| 宣汉县| 宜宾县| 垦利县| 桂东县| 登封市| 威远县| 新乡县| 衡水市| 阿图什市| 仲巴县| 福州市| 牟定县| 肇源县| 格尔木市| 龙山县| 略阳县| 鄂托克前旗| 连州市| 和静县| 承德县| 颍上县| 岳阳县| 贵南县| 玉田县| 朔州市| 崇仁县| 弋阳县| 闻喜县| 彩票| 礼泉县| 三都| 广河县| 长顺县| 枣庄市| 鸡泽县| 安阳市| 平遥县| 武鸣县| 家居|