UIViewContrller(續)

來源:互聯網
上載者:User

    前面說過了viewController的一些基本注意事項。這裡針對不同的viewController類,描述一下各自用法的注意事項。至於每種viewController的基本用法,可以參看蘋果的官方文檔”View

 controller Programming Guide for IOS”,上面對UINavigationController,UITabBarController,UIModelViewController等一些常見的viewController解釋的非常清楚,並且官方還專門針對UITableViewController寫了一個嚮導。

    先看UINavigationController比較常見的問題。在實際開發中,往往會發現設計的導航條和蘋果標準的導航條不一樣,畢竟大家都用蘋果預設的導航條難免會有視覺疲勞。出現這種情況怎麼辦?如果僅僅是改變導航條的顏色還好辦,如果設計的導航條和蘋果預設的導航條大相徑庭那就麻煩了。下面就分析下根據設計的導航條跟蘋果預設的導航條相差的不同情況,用不同的方法實現。

1)如果僅僅改變顏色,並且導覽列中的buttomItem的形狀也用蘋果內建的形狀,那麼就很簡單了,只要更改tintColor就可以了。

2)如果導航條要增加背景圖片,但是這個背景圖片的寬和高保持和導航條預設的一樣。這樣可以考慮用下面的代碼實現:

    UIImageView *barSeperator = [[UIImageView alloc] initWithImage:[cache retrieveObjectNamed:@"list_seperator@2x.png"]];    barSeperator.frame = CGRectMake(0, self.navigationController.navigationBar.bounds.size.height - 2, 320, 2);    UIImageView *barImage = [[UIImageView alloc] initWithImage:[cache retrieveObjectNamed:@"list_po@2x.png"]];    barImage.frame = CGRectMake(0, 0, 320, self.navigationController.navigationBar.bounds.size.height - 2);    [self.navigationController.navigationBar addSubview:barImage];    [self.navigationController.navigationBar addSubview:barSeperator];    [barSeperator release];    [barImage release];

原理很簡單就是在導航條上面加一個背景圖片,不過這個方法最好寫在- (void)viewWillAppear中,而在viewWillDisappear的時候把這個背景條去掉,這樣就不會影響下一個導航條的外觀。那麼在增加了這個背景條的同時,最好再用自己設計的UIBarButtonItem,因為現再用系統內建的就顯的及其不自然。這樣就需要你在自己設計的viewcontroller中navigationItem的hidden屬性設為YES,然後自己嚮導航條上增加UIButton就行了,也就是完全不用UIBarButtonItem了,因為這個控制項的形狀你很難改變。

3)最後就是最離譜的設計,完全背棄蘋果導航條的設計規則,導航條的背景,形狀和大小都不一樣,那麼只能用下面的方法了。就是隱藏導航條,然後自己單獨設計一個UIView或者UIImageView放上去,只是用到了UINavigationController對UIViewController的導航功能而已。

這裡需要指出的是UIViewController類中都會有導航條類的navigationItem的屬性,但是這裡唯讀,你不能給它指定UIBarButtonItem,這個應該只是給開發人員提供一個簡單介面便於訪問。如果要改變還是要進入到UINavigationController中的items獲得。

    UITableViewController是開發中最常用的一個類。UITableView中儲存格的控制往往是痛點,根據儲存格內容排布的不同,如何選用不同的cell。在”Table View Programming Guide for IOS”都有詳細的解釋,下面只是針對容易犯錯誤的地方進行討論。

1)當你使用系統內建的儲存格類型的時候如:UITableViewCellStyleSubtitle首先要清楚這個類型的儲存格如何布局的。

                                                                                           圖1

所以有些時候使用這些預設的屬性,但是又的按照軟體設計的圖紙開發。譬如:Image可能設計的比官方指定的要寬很多,可能佔用了cell的1/3。你如果用預設屬性是怎麼都不可能改變圖片的寬度的,因為cell中ImageView的屬性是readOnly,像這種情況就沒有辦法必須自訂儲存格了。還有就是AccessoryView,如果你用系統內建的儲存格屬性,同樣大小已經限制了,你無論如何都是改變不了的,所以在開發前,分析時一定要考慮這些問題,否則開發的時候會非常的棘手。就像上面說的,如果某個設計和UITableViewCellStyleSubtitle中的布局非常相似,但是就是image寬度不一樣,這樣如果當初你選擇了UITableViewCellStyleSubtitle類型,你就開始糾結吧,無論怎麼調節圖片的大小都是很難實現出設計圖紙的效果。

2)UITableView儲存格往往是需要重用的,所以如果這樣寫代碼:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *CellIdentifierText = @"CellText";    UITableViewCell *cell=nil;    cell = [tableView dequeueReusableCellWithIdentifier:@"Message"];    if (cell == nil) {        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Message"]autorelease];        UIImageView * imgview = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Message_separator@2x.png"]];        imgview.frame = CGRectMake(0,53, 320, 1);        [cell.contentView addSubview:imgview];        [imgview release];   return cell;}

這裡增加的UIImageView如果不remove的話,會在所有的儲存格中顯示,所以如果儲存格的布局不同時,一定要慎用重用,不然會發現儲存格中的布局亂七八糟的。

3)UITableView經常會用到NSIndexPath這個屬性,用來確定儲存格的位置,那麼你要想獲得第三行的儲存格實體,你代碼會這樣寫麼:

NSIndexPath * index = [[NSIndexPath alloc] initWithIndex:3];UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

如果你這樣寫,可以保證程式crash掉。因為NSIndexPath是屬於Foundation.framework中的類,代表的是在一顆樹中指向某個節點的路徑。如所示:

                                                                 圖2

而IOS為NSIndexPath增加了編程的介面,目的是用來適應UITableView對象中,段和行的定位。所以UIKit的API擴充了NSIndexPath。而indexPathForRow:inSection: 這個方法才是建立得UITableView對象中的NSIndexPath。所以在用NSIndexPath不能盲目的就給它初始化,一定要根據不同的情況進行分析,如果是要獲得UITableViewCell對象的,一定要用UIKit中擴充的方法。而當你想利用此樹儲存東西的時候,當然可以使用它初始化的方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.