亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

從零開始學ios開發(十四):NavigationControllersandTableViews(上)

2019-11-14 20:20:15
字體:
來源:轉載
供稿:網友

這一篇我們將學習一個新的控件Navigation Controller,很多時候Navigation Controller是和Table View緊密結合在一起的,因此在學習Navigation Controller的同時,我們還將繼續學習Table View其他一些特性,畢竟Navigation Controller還是相對來說畢竟簡單的,沒有什么太大的花頭,它的主要作用就是一個view的切換,切來切去,而Table View的花頭就比較多了,這次我們將這2個控件結合在一起進行學習。

再多說一些關于Navigation Controller,Navigation Controller相信大家都見到過,打開你的iphone,在設置(Settings)里,選擇通用(General),最最上面的就是Navigation Controller,它的左邊是一個按鈕(稱之為Navigation Button),點擊按鈕切換到前一個view,中間有一個title,顯示當前view的title,Navigation Controller的下面就是一個Table View。

Navigation Controller對view的切換是有前后順序的,即從哪個view切換過來,然后切換回去的時候還是這個view,他們之間的順序是不變的,你可以理解Navigation Controller就像一個棧(Stack)先進后出,對比與之前在第11篇中學習的Tab Bar,Tab Bar也是用來控制view之間的切換的,但是它是任意切換,各個view之間沒有前后關系。Navigation Controller的view的組織結構也和Tab Bar是很相似的,它也有一個根view(root view)用來控制其他的views,好了,下面開始我們這次的學習內容。

1)創建一個工程,選擇Empty application,將工程名命名為“Nav”

2)創建Top-Level View Controller(root view controller)
選中PRoject navigator中的Nav文件夾,單擊鼠標右鍵,選擇“New File...”,或者使用快捷鍵command+N,或者使用菜單欄File>New>New File...,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇Objective-C class,點擊Next按鈕,在下一個窗口中將class命名為BIDFirstLevelController,Subclass of命名為UITableViewController

點擊Next按鈕,完成創建。


BIDFirstLevelController是一個root view controller,用來控制其他的view,也是程序啟動時,第一個載入的view。

下面打開BIDAppDelegate.h,添加如下代碼

復制代碼
#import <UIKit/UIKit.h>@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (strong, nonatomic) UINavigationController *navController;@end
復制代碼

我們添加了一個UINavigationController的對象,接著打開BIDAppDelegate.m,添加如下code

復制代碼
#import "BIDAppDelegate.h"#import "BIDFirstLevelController.h"@implementation BIDAppDelegate@synthesize window = _window;@synthesize navController;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    // Override point for customization after application launch.        BIDFirstLevelController *first = [[BIDFirstLevelController alloc] initWithStyle:UITableViewStylePlain];    self.navController = [[UINavigationController alloc] initWithRootViewController:first];    [self.window addSubview:navController.view];        self.window.backgroundColor = [UIColor whiteColor];    [self.window makeKeyAndVisible];    return YES;}
復制代碼

這里主要解釋application:didFinishLauchingWithOptions方法中新添加的3行代碼:
BIDFirstLevelController *first = [[BIDFirstLevelController alloc] initWithStyle:UITableViewStylePlain];
創建一個BIDFirstLevelController的對象,BIDFirstLevelController繼承自UITableViewController,因此它可以使用UITableViewController中的方法,包括聲明時用到的initWithStyle:UITableViewStylePlain(UITableViewStylePlain之前的章節講到過,table view的2中表現形式plain和grouped)

self.navController = [[UINavigationController alloc] initWithRootViewController:first];
接著,創建UINavigationController的對象,使用的初始化的方式是initWithRootViewController,然后參數是first。這個初始化的意思是當載入程序時,在navigator下顯示的第一個view(root view)是什么(navigator總是需要一個view和它配合著一起工作,否則孤零零的一個navigator在那邊,下面什么都沒有,就沒有意義了),這里指定的root view是BIDFirstLevelController的對象。

[self.window addSubview:navController.view];
將navController的view添加到window中用于程序啟動時顯示(之前的文章應該講到過,iphone有且只有一個window,我個人覺得可以認為就是iphone的屏幕,且只有一個,然后一個程序運行時需要顯示,這時候必須告訴iphone的window那個view是第一個顯示的,第一個顯示的view也叫root view),在這里就是告訴iphone的window,第一個顯示的view是navController的view。

簡單的總結一下上面3句話的含義,就是程序啟動后在iphone的window中首先顯示navController的view,然后在navController的view中顯示BIDFirstLevelController。Navigator Controller的view有2部分組成,最上面的navigator bar和下面的內容view(在這個例子中,下面的內容view我們指定為BIDFirstLevelController)

至此,我們整個的程序結構已經搭建完畢了,接下來需要做的就是實現BIDFirstLevelController中的內容,然后添加其他的table view用于view的切換,但是這些操作都是基于這個結構的,理解了上面的內容,下面的內容學習起來就會游刃有余了。

我們編譯運行一下code,看看效果

發現除了最上面的navController和下面的BIDFirstLevelController,其他什么都沒有,但是你要知道這些東西是怎么來的,他們之間的關系是什么就可以了。

3)實現BIDSecondLevelViewController
我們新添加一個類,叫做BIDSecondLevelViewController,這個類繼承自UITableViewController,是所有subtableview的基類。

選中Project navigator中的Nav文件夾,單擊鼠標右鍵,選擇“New File...”,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇Objective-C class,點擊Next按鈕,在下一個窗口中將class命名為BIDSecondLevelViewController,Subclass of命名為UITableViewController,點擊Next按鈕,完成創建。

打開BIDSecondLevelViewController.h,添加如下代碼

復制代碼
#import <UIKit/UIKit.h>@interface BIDSecondLevelViewController : UITableViewController@property (strong, nonatomic) UIImage *rowImage;@end
復制代碼

打開BIDSecondLevelViewController.m

復制代碼
#import "BIDSecondLevelViewController.h"@implementation BIDSecondLevelViewController@synthesize rowImage;@end
復制代碼

我們僅僅在代碼中添加了一個UIImage,這樣,當所有的subtableview繼承BIDSecondLevelViewController后,他們也就有了UIImage屬性,而不必每個subtableview定義各自的UIImage了。

4)實現BIDFirstLevelController
打開BIDFirstLevelController.h,添加如下代碼

復制代碼
#import <UIKit/UIKit.h>@interface BIDFirstLevelController : UITableViewController@property (strong, nonatomic) NSArray *controllers;@end
復制代碼

這里僅僅添加了一個NSArray,它將保存所有的子table view

BIDFirstLevelController.m,添加如下代碼

復制代碼
#import "BIDFirstLevelController.h"#import "BIDSecondLevelViewController.h"@implementation BIDFirstLevelController@synthesize controllers;- (void)viewDidLoad {    [super viewDidLoad];    self.title = @"First Level";    NSMutableArray *array = [[NSMutableArray alloc] init];    self.controllers = array;}- (void)viewDidUnload {    [super viewDidUnload];    self.controllers = nil;}#pragma mark -#pragma mark Table Data Source Methods- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    return [self.controllers count];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    static NSString *FirstLevelCell = @"FirstLevelCell";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:FirstLevelCell];        if(cell == nil) {        cell = [[UITableViewCell alloc]                initWithStyle:UITableViewCellStyleDefault                reuseIdentifier:FirstLevelCell];    }        //configure the cell    NSUInteger row = [indexPath row];    BIDSecondLevelViewController *controller = [controllers objectAtIndex:row];    cell.textLabel.text = controller.title;    cell.imageView.image = controller.rowImage;    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;    return cell;}#pragma mark -#pragma mark Table View Delegate Methods- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    NSUInteger row = [indexPath row];    BIDSecondLevelViewController *nextController = [self.controllers objectAtIndex:row];    [self.navigationController pushViewController:nextController animated:YES];}@end
復制代碼

首先引入BIDSecondLevelViewController的頭文件,這樣BIDFirstLevelController就可以對它的對象進行操作(可以對rowImage進行操作)。
viewDidLoad方法:
self.title = @"First Level"; //對title進行賦值,navigator controller會很聰明的知道當前顯示的table view的title是什么,并把這個title顯示在自己的上面(剛才上面運行的畫面,navigator controller上面是空的,什么都沒有,這個是因為剛才還沒有實現BIDFirstLevelController,現在如果再運行程序,你會發現navigator controller上面會顯示“First Level”)。
NSMutableArray *array = [[NSMutableArrayalloc] init]; //聲明一個NSMutableArray對象,之后我們將把每一個實現的子table view添加到這個對象中,因此我們這里聲明的是mutableArray,我們需要對其進行添加操作(之前有例子我們聲明為immutable,我們不需要對其進行添加刪除操作)

tableView:numberOfRowsInSection方法就不解釋了,作用和之前幾篇的例子一樣。

tableView:cellForRowAtIndexPath方法的前半部分是和之前的例子是一樣的,后半部分,從array中取出一個subtableview(每個subtableview都繼承自BIDSecondLevelViewController,因此可以將其類型轉換為其基類類型),獲取其title和rowImage并賦值給cell的textLabel和imageView,最后定義cell的accessoryType。

tableView:didSelectRowAtIndexPath方法,當我們點擊table view的某一行是,會觸發這個方法,這里實現的功能是點擊后,切換到當前cell對應的subtableview。
NSUInteger row = [indexPath row]; //獲取當前點擊的是哪一行
BIDSecondLevelViewController *nextController = [self.controllers objectAtIndex:row]; //根據點擊的行,獲得array中相應的subtableview
[self.navigationController pushViewController:nextController animated:YES]; //將對應subtableview推入棧

還好,上面的實現總的來說還算簡單,我們在此編譯運行一下程序,效果如下

最最主要的變化就是navigator上面顯示了當前table view的title“First Level”,其他的變化似乎還不是很大,但是其后面的變化已經很巨大,接下來我們將添加5個subtableview,逐漸完成這個程序。

(先下載這里的圖標Nav_Image,解壓縮后拖到Project navigator中的Nav文件夾下,直接拖進去就可以

5)第一個subtableview:The Disclosure Button View
所謂disclosure button,就是指table view中的藍色圓圈箭頭按鈕,如下

點擊這個按鈕后,會轉向下一個table view。

簡單說一下這個例子,首先會在root view中有一個cell與之關聯,點擊該行cell會轉到該table view,然后這個table view中有很多cell,每一個cell都有一個textLabel和一個disclosure button,點擊cell(不點擊disclosure button)會有一個警告框彈出,點擊disclosure button,會轉到下一個table view顯示詳細內容。

好了,現在開始這個例子,首先選中Project navigator中的Nav文件夾,單擊鼠標右鍵,選擇“New File...”,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇Objective-C class,點擊Next按鈕,在下一個窗口中將class命名為BIDDisclosureButtonController,Subclass of命名為BIDSecondLevelViewController,點擊Next按鈕,完成創建。

BIDDisclosureButtonController上面會放置很多個cell,每個cell都有一個textLabel和一個disclosure button

再次選中Project navigator中的Nav文件夾,單擊鼠標右鍵,選擇“New File...”,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇Objective-C class,點擊Next按鈕,在下一個窗口中將class命名為BIDDisclosureDetailController,Subclass of命名為UIViewController,點擊Next按鈕,完成創建。

當點擊BIDDisclosureButtonController上的disclosure button后,會轉到BIDDisclosureDetailController,顯示詳細內容。

打開BIDDisclosureDetailController.h,添加如下代碼

復制代碼
#import <UIKit/UIKit.h>@interface BIDDisclosureDetailController : UIViewController@property (strong, nonatomic) IBOutlet UILabel *label;@property (copy, nonatomic) NSString *message;@end
復制代碼

我們定義了一個outlet,用來指向UILabel,之后我們會添加一個xib,xib上會拖入一個Label控件,這個outlet就是指向xib上的Label控件的。我們還定義了一個NSString用于保存字符串,這個字符串會顯示在label上。

這里有一個問題,為什么還需要另外定義一個message,而不是直接賦值誒label,這個是因為UILabel是xib上的一個控件,當view沒有載入的時候,這個UILabel是不存在的,我們沒有辦法為其賦值,所以我們就暫時保存在一個變量中,然后當xib載入后,再賦值給label,曲線救國嘛,

打開BIDDisclosureDetailController.m,添加如下代碼

復制代碼
#import "BIDDisclosureDetailController.h"@implementation BIDDisclosureDetailController@synthesize label;@synthesize message;- (void)viewWillAppear:(BOOL)animated {    label.text = message;    [super viewWillAppear:animated];}- (void)viewDidUnload {    self.label = nil;    self.message = nil;    [super viewDidUnload];}@end
復制代碼

注意,我們這里使用了viewWillAppear,而不是通常使用的viewDidLoad,viewDidLoad只有在第一次載入view的時候才會被調用到,如果這個view被反復的載入,那么之后的載入過程,viewDidLoad將不會被調用,而viewWillAppear則不用,每次view的載入,這個方法都會被調用到,在這里例子中,我們將多次載入xib,而且每次xib顯示的內容會根據之前一個table view中cell的不同而不同,因此每次都需要更新內容,所以在這種情況下,使用viewWillAppear是比較恰當的選擇。

選中Project navigator中的Nav文件夾,單擊鼠標右鍵,選擇“New File...”,在彈出的窗口中,左邊選擇User Interface,右邊選擇View,點擊Next按鈕,Device Family選擇iphone,點擊Next按鈕,命名為BIDDisclosureDetail.xib,點擊Create按鈕,完成創建。

選擇Project navigator中的BIDDisclosureDetail.xib,然后點擊File's Owner,打開Identity inspcetor,將Class指定為BIDDisclosureDetailController

然后control-drag File's Owner到Objects中的View上,在彈出的框中選擇view,完成關聯。
 

從Library中拖一個UILabel放在view的正中間,然后拉伸UILabel的寬度到左右兩邊,將label的文字對其方式設置為居中,然后control-drag File's Owner到label,在彈出的框中選擇label,完成關聯。

打開BIDDisclosureButtonController.h,添加如下代碼

#import "BIDSecondLevelViewController.h"@interface BIDDisclosureButtonController : BIDSecondLevelViewController@property (strong, nonatomic) NSArray *list;@end

代碼中僅僅定義了一個NSArray,用于保存在table view中的每一行的內容

打開BIDDisclosureButtonController.m,添加如下代碼

復制代碼
#import "BIDDisclosureButtonController.h"#import "BIDAppDelegate.h"#import "BIDDisclosureDetailController.h"@interface BIDDisclosureButtonController() @property (strong, nonatomic) BIDDisclosureDetailController *childController;@end@implementation BIDDisclosureButtonController@synthesize list;@synthesize childController;- (void)viewDidLoad {    [super viewDidLoad];    NSArray *array = [[NSArray alloc] initWithObjects:@"Toy Story",                                       @"A Bug's Life", @"Toy Story 2", @"Monsters, Inc.",                                       @"Finding Nemo", @"The Incredibles", @"Cars",                                       @"Ratatouille", @"WALL-E", @"Up", @"Toy Story 3",                                       @"Cars 2", @"Brave", nil];    self.list = array;}- (void)viewDidUnload {    [super viewDidUnload];    self.list = nil;    self.childController = nil;}#pragma mark -#pragma mark Table Data Source Methods- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    return [list count];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    static NSString *DisclosureButtonCellIdentifier = @"DisclosureButtonCellIdentifier";        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DisclosureButtonCellIdentifier];        if (cell == nil) {        cell = [[UITableViewCell alloc]                initWithStyle:UITableViewCellStyleDefault                reuseIdentifier:DisclosureButtonCellIdentifier];    }        NSUInteger row = [indexPath row];    NSString *rowString = [list objectAtIndex:row];    cell.textLabel.text = rowString;    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;    return cell;}#pragma mark -#pragma makr Table Delegate Methods- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hey, do you see the disclosure button?"                                                    message:@"If you're trying to drill down, touch that instead"                                                   delegate:nil                                          cancelButtonTitle:@"Won't happen again"                                          otherButtonTitles:nil];    [alert show];}- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {    if (childController == nil) {        childController = [[BIDDisclosureDetailController alloc] initWithNibName:@"BIDDisclosureDetail" bundle:nil];    }    childController.title = @"Disclosure Button Pressed";    NSUInteger row = [indexPath row];    NSString *selectdMovie = [list objectAtIndex:row];    NSString *detailMessage = [[NSString alloc] initWithFormat:@"You pressed the disclosure button for %@.",selectdMovie];    childController.message = detailMessage;    childController.title = selectdMovie;    [self.navigationController pushViewController:childController animated:YES];}@end
復制代碼

代碼的開頭有一個很少見的@interface,這是Objective-C的一種語法現象,用于對類的擴展,稱之為class extension,意思是就某些情況下,單獨的對一個已存在的類進行擴展(這里是添加了一個BIDDisclosureDetailController對象),而這個擴展只對當前類有用,其他地方調用相同的類,里面不會有擴展的內容。(好吧,其實我也對Objective-C不是很熟悉,要詳細了解Objective-C大家還是找一本書看看比較好)
viewDidLoad中,創建了一個字符串數組,里面保存了table view中顯示的cell的內容。
tableview:numberOfRowsInSectiontableView:cellForRowAtIndexPath都是很常見的實現,和之前例子中的一樣。
tableView:didSelectRowAtIndexPath方法,當點擊tableview的row時,會調用該方法。
tableView:accessoryButtonTappedForRowWithIndexPath方法,當點擊row右邊的disclosure button時,會調用該方法。在該方法中,首先判斷childController是否被創建過,如果沒有,就根據xib文件名創建一個,之后的代碼應該都可以讀懂是什么意思。 

最后一步,修改BIDFirstLevelController,將BIDDisclosureButtonController添加進去,打開BIDFirstLevelController.m,添加如下代碼

復制代碼
#import "BIDFirstLevelController.h"#import "BIDSecondLevelViewController.h"#import "BIDDisclosureButtonController.h"......- (void)viewDidLoad {    [super viewDidLoad];    self.title = @"First Level";    NSMutableArray *array = [[NSMutableArray alloc] init];        // Disclosure Button    BIDDisclosureButtonController *disclosureButtonController = [[BIDDisclosureButtonController alloc] initWithStyle:UITableViewStylePlain];    disclosureButtonController.title = @"Disclosure Buttons";    disclosureButtonController.rowImage = [UIImage imageNamed:@"disclosureButtonControllerIcon.png"];    [array addObject:disclosureButtonController];        self.controllers = array;}
復制代碼

首先引入BIDDisclosureButtonController.h頭文件,然后在viewDidLoad方法中,創建一個BIDDisclosureButtonController對象,設置title和image,最后把它加入到array中,ok,我們第一個table view的操作到底結束,下面編譯運行一下

程序運行后的第一個畫面,多了一行cell,cell的最左邊是我們添加的rowImage,然后是下一個table view的title,最右邊是一個向右的箭頭,點擊第一個的cell,我們就進入到與之對應的下一個table view:BIDDisclosureButtonController

在navigator中顯示了當前table view的title(整個title是在BIDFirstLevelController的viewDidLoad中設定的),navigator左邊的按鈕上顯示了上一層table view的title,表示點擊這個按鈕可以返回到哪一個table view。點擊table view中任意一個cell(不要點最右邊的圓圈箭頭按鈕,否則會切換到再下一層的table view),一個警告框彈出

這個就是調用了tableView:didSelectRowAtIndexPath方法,點擊最右邊的圓圈箭頭按鈕,轉到再下一層的table view(BIDDisclosureDetailController)

上面顯示了這個detail view的內容

好了,整個的程序就是這樣,有點小小的復雜,不過如果你弄懂了其中的關系,實現起來還是不難的,不過需要很仔細。

6)第二個subtableview:The Checklist
這個例子相對簡單一些,就是點擊table view中的cell,然后cell的右邊會出現一個對勾,表示選中的狀態,當選擇另一行的cell時,這個對勾會出現在這一個cell上,而之前的對勾會消失。

好了,開始工作,選中Project navigator中的Nav文件夾,單擊鼠標右鍵,選擇“New File...”,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇Objective-C class,點擊Next按鈕,在下一個窗口中將class命名為BIDCheckListController,Subclass of命名為BIDSecondLevelViewController,點擊Next按鈕,完成創建。

打開BIDCheckListController.h,添加如下代碼

復制代碼
#import "BIDSecondLevelViewController.h"@interface BIDCheckListController : BIDSecondLevelViewController@property (strong, nonatomic) NSArray *list;@property (strong, nonatomic) NSIndexPath *lastIndexPath;@end
復制代碼

NSArray用于保存cells的內容,由于我們只允許一行cell被選中,因此我們需要記錄上一次選中的是哪行cell,當選擇新的一行cell時,把上一次選中的cell的對勾去掉,創建一個NSIndexPath變量,用來保存最后一次選中的cell。

打開BIDCheckListController.m,添加如下代碼

復制代碼
#import "BIDCheckListController.h"@implementation BIDCheckListController@synthesize list;@synthesize lastIndexPath;- (void)viewDidLoad {    [super viewDidLoad];    NSArray *array = [[NSArray alloc] initWithObjects:@"Who Hash",                      @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks",                      @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green",                      @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil];    self.list = array;}- (void)viewDidUnload {    [super viewDidUnload];    self.list = nil;    self.lastIndexPath = nil;}#pragma mark -#pragma mark Table Data Source Methods- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    return [list count];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    static NSString *CheckMarkCellIdentifier = @"CheckMarkCellIdentifier";        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CheckMarkCellIdentifier];        if (cell == nil) {        cell = [[UITableViewCell alloc]                initWithStyle:UITableViewCellStyleDefault                reuseIdentifier:CheckMarkCellIdentifier];    }        NSUInteger row = [indexPath row];    NSUInteger oldRow = [lastIndexPath row];    cell.textLabel.text = [list objectAtIndex:row];    cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;        return cell;}#pragma mark -#pragma mark Table Delegate Methods- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    int newRow = [indexPath row];    int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;        if(newRow != oldRow) {        UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];        newCell.accessoryType = UITableViewCellAccessoryCheckmark;                UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:lastIndexPath];        oldCell.accessoryType = UITableViewCellAccessoryNone;        lastIndexPath = indexPath;    }    [tableView deselectRowAtIndexPath:indexPath animated:YES];}@end
復制代碼

有幾個地方需要解釋一下
tableView:cellForRowAtIndexPath方法中:
cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
看選中的行和之前選中的行是否一樣而起lastIndexPath必須存在,這樣的話,在新選中的行上顯示對勾,UITableViewCellAccessoryCheckmark會在cell上顯示對勾(我認為這個判斷是在已經選中過cell,然后選中navigator上的返回按鈕返回到上一層的view,之后在此進入這個view的時候,做一個這樣的判斷,看看在view載入的時候,是否需要對某一個cell進行選擇)
tableView:didSelectRowAtIndexPath方法,我覺得里面實現的方式還是很直觀的,直接讀代碼應該可以看懂里面的意思。

最后一步,修改BIDFirstLevelController,將BIDCheckListController添加進去,打開BIDFirstLevelController.m,添加如下代碼

復制代碼
#import "BIDFirstLevelController.h"#import "BIDSecondLevelViewController.h"#import "BIDDisclosureButtonController.h"#import "BIDCheckListController.h"@implementation BIDFirstLevelController@synthesize controllers;- (void)viewDidLoad {    [super viewDidLoad];    self.title = @"First Level";    NSMutableArray *array = [[NSMutableArray alloc] init];        // Disclosure Button    BIDDisclosureButtonController *disclosureButtonController = [[BIDDisclosureButtonController alloc] initWithStyle:UITableViewStylePlain];    disclosureButtonController.title = @"Disclosure Buttons";    disclosureButtonController.rowImage = [UIImage imageNamed:@"disclosureButtonControllerIcon.png"];    [array addObject:disclosureButtonController];        //Checklist    BIDCheckListController *checkListController = [[BIDCheckListController alloc] initWithStyle:UITableViewStylePlain];    checkListController.title = @"Check One";    checkListController.rowImage = [UIImage imageNamed:@"checkmarkControllerIcon.png"];    [array addObject:checkListController];        self.controllers = array;}
復制代碼

這個就不解釋了,和之前的一樣,編譯運行程序

多了一行Check One,選中該行天轉到BIDCheckListController

隨便選哪一行,會有一個對勾出現,如果選中另一行,對勾會出現在另一行上
 

7)未完待續
這篇就暫時到這里,我們還將添加其他3個subtableview,會在下一篇中進行介紹,謝謝!

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合久久精品亚洲国产| 97热在线精品视频在线观看| 国产精品久久婷婷六月丁香| 久久久久久久97| 成人午夜一级二级三级| 欧美激情影音先锋| 欧美黄色成人网| 情事1991在线| 亚洲成人av在线| 色小说视频一区| 国产美女扒开尿口久久久| 日韩欧美成人免费视频| 成人性生交大片免费观看嘿嘿视频| 中文字幕久久久| 亚洲无限乱码一二三四麻| 欧美一区第一页| 欧美极品少妇xxxxx| 国产精品久久久久久久久久久不卡| 欧美精品在线免费播放| 亚洲精品大尺度| 亚洲电影免费观看高清| 亚洲福利视频网站| 成人亚洲综合色就1024| 欧美国产日韩xxxxx| 久久久精品国产| 国产91精品久| 日本一区二区在线免费播放| 97久久久久久| 欧美激情第99页| 亚洲aⅴ男人的天堂在线观看| 成人久久精品视频| 欧美另类精品xxxx孕妇| 91精品国产乱码久久久久久蜜臀| 国产精品自拍偷拍| 日韩电影在线观看中文字幕| 欧美一级大片在线观看| 欧美日韩国产丝袜美女| 中文字幕日韩在线播放| 亚洲综合日韩在线| 亚洲第一天堂无码专区| 66m—66摸成人免费视频| 欧美成人第一页| 91精品久久久久久久久久久久久久| 国产精品丝袜一区二区三区| 欧美区二区三区| www.欧美视频| 欧美疯狂xxxx大交乱88av| www国产精品com| 亚洲精品在线看| 92看片淫黄大片欧美看国产片| 一本色道久久88亚洲综合88| 欧美一区深夜视频| 亚洲黄色有码视频| 国产在线精品自拍| 亚洲成人a级网| 久99久在线视频| 欧美性猛交xxxx免费看| 高清亚洲成在人网站天堂| 欧美一级视频一区二区| 久久久亚洲影院你懂的| 精品一区二区三区电影| 中文字幕精品www乱入免费视频| 亚洲精品久久久久久久久久久久| 欧美高清在线观看| 91欧美精品午夜性色福利在线| 国产亚洲xxx| 91精品国产综合久久香蕉最新版| 国产精品成人免费电影| 亚洲欧美中文字幕在线一区| 国产欧美精品va在线观看| 中文欧美日本在线资源| 国精产品一区一区三区有限在线| 91精品国产免费久久久久久| 久久精品在线播放| 久久久999成人| 中文字幕免费精品一区高清| 日本一区二区不卡| 久久全球大尺度高清视频| 日韩一区二区三区xxxx| 久久久噜噜噜久噜久久| 日韩动漫免费观看电视剧高清| 日韩欧美高清在线视频| 国产精品jvid在线观看蜜臀| 国产午夜一区二区| 国产成人午夜视频网址| 青青草成人在线| 国产精品久久久久久久天堂| 国产精品电影一区| 成人黄色免费看| 国产成人av网| 久久久久久国产精品| 日本久久中文字幕| 97在线免费观看| 国产精品久久久久久五月尺| 国产精品稀缺呦系列在线| 97视频在线看| 欧洲亚洲妇女av| 亚洲精品一区二区三区不| 九色成人免费视频| 97精品伊人久久久大香线蕉| 久99久在线视频| 欧美一级大片视频| 久久久久久伊人| 美女扒开尿口让男人操亚洲视频网站| 欧美激情区在线播放| 色婷婷综合成人av| 精品国产一区二区三区久久| 国产精品成av人在线视午夜片| 日本国产欧美一区二区三区| 国产91色在线| 国内精品国产三级国产在线专| 91久久综合亚洲鲁鲁五月天| www.欧美视频| 国产精品久久久久9999| 国产欧亚日韩视频| 成人欧美在线视频| www国产91| 91久久在线播放| 中文字幕日韩免费视频| 日韩在线免费av| 久久久精品日本| 国产999在线| 亲子乱一区二区三区电影| 亚洲精品自在久久| 97不卡在线视频| 丁香五六月婷婷久久激情| 91沈先生作品| 日韩在线激情视频| 国产国产精品人在线视| 中文字幕综合在线| 亚洲免费视频在线观看| 亚洲视频在线免费观看| 91免费欧美精品| **欧美日韩vr在线| 亚洲在线视频观看| 亚洲永久在线观看| 欧美一级大片视频| 一区二区三区视频免费| 国产999精品久久久影片官网| 日本最新高清不卡中文字幕| 成人夜晚看av| 91成人在线观看国产| 国产精品久久视频| 亚洲美女久久久| 亚洲精品成人免费| 在线视频精品一| 国产精品免费看久久久香蕉| 亚洲老头同性xxxxx| 亚洲欧美日韩中文在线| 亚洲精品欧美一区二区三区| 亚洲裸体xxxx| 色诱女教师一区二区三区| 久久久国产一区| 日韩亚洲欧美成人| 久久久久久久久久久91| 国产精品久久77777| 91九色在线视频| 久久精品视频导航| www.欧美精品| 91中文精品字幕在线视频| 91精品久久久久久久久久另类| 日韩av在线资源| 亚洲欧美一区二区精品久久久| 亚洲欧美中文字幕在线一区|