Iphone开发基础教程 (9章 导航控制器和表视图)--读书笔记

导航控制器

UINavigationController是用于构建分层应用程序的主要工具

UINavigationController是作为栈来实现的,这让它非常适合用于处理分层数据

导航控制器维护一个视图控制器栈,任何类型的视图控制器都可以放入栈中。在设计导航控制器时,你需要指定用户看到的第一个视图,该视图是视图层次结构中最低层的视图,器控制器称为根视图控制器(root view controller),根视图控制器是被导航控制器推入到栈中的第一个视图控制器。当用户选择查看一个视图时,栈中将加入一个新的视图控制器,它所控制视图将展示给用户。我们把这些新的视图控制器称为子控制器(subcontroller)




1、新建Single View Application 名字Nav

2、新建UIViewController subclass 名字:RootViewController

3、修改delegate

@class NavViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    IBOutlet UINavigationController *navController;
}

@property (retain, nonatomic) IBOutlet UIWindow *window;
@property (retain, nonatomic) UINavigationController *navController;

@end
@implementation AppDelegate

@synthesize window = _window;
@synthesize navController;

-(void) applicationDidFinishLaunching:(UIApplication *)application
{
    [_window addSubview:navController.view];
    [_window makeKeyAndVisible];
}

- (void)dealloc
{
    [navController release];
    [_window release];
    [super dealloc];
}
4、打开MainWindow.xib,拖一个Navigation Controller到dock上,







选中View Controller,将其class改为RootViewController


5、新建SecondLevelViewController


6、修改RootViewController


#import "RootViewController.h"
#import "SecondLevelViewController.h"
#import "AppDelegate.h"

@implementation RootViewController

@synthesize controllers;

- (void)viewDidUnload
{
    self.title = @"Root Level";
    NSMutableArray *array = [[NSMutableArray alloc] init];
    self.controllers = array;
    [array release];
    [super viewDidUnload];
}

- (void)dealloc {
    [controllers release];
    [super dealloc];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.controllers count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *RootViewControllerCell = @"RootViewControllerCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RootViewControllerCell];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:RootViewControllerCell] autorelease];
    }
    NSUInteger row = [indexPath row];
    SecondLevelViewController *controller = [controllers objectAtIndex:row];
    cell.text = controller.title;
    cell.image = controller.rowImage;
    return cell;
}

-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];
    SecondLevelViewController *nextController = [self.controllers objectAtIndex:row];
    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.navController pushViewController:nextController animated:YES];
}

实现第一个子控制器

1、新建UIViewController subclass 命名为DisclosureButtonController

2、新建DisClosureDetailController

@interface DisclosureDetailController : UIViewController
{
    IBOutlet UILabel *label;
    NSString *message;
}

@property (nonatomic,retain) UILabel *label;
@property (nonatomic,retain) NSString *message;

@end
@implementation DisclosureDetailController

@synthesize label;
@synthesize message;

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        //..
    }
    return self;
}

-(void) viewWillAppear:(BOOL)animated
{
    label.text = message;
    [super viewWillAppear:animated];
}

- (void)dealloc {
    [label release];
    [message release];
    [super dealloc];
}

@end
3、修改DisclosureButtonController

#import <UIKit/UIKit.h>
#import "SecondLevelViewController.h"
@class DisclosureButtonController;

@interface DisclosureButtonController : SecondLevelViewController <UITabBarDelegate,UITableViewDataSource>
{
    NSArray *list;
    DisclosureButtonController *childController;
}
@property (nonatomic,retain) NSArray *list;

@end
#import "DisclosureButtonController.h"
#import "NavAppDelegate.h"
#import "DisclosureDetailController.h"

@implementation DisclosureButtonController
@synthesize list;

-(id) initWithStyle:(UITableViewStyle)style
{
    if (self = [super initWithStyle:style]) {
        //..
    }
    return self;
}

- (void)dealloc {
    [list release];
    [childController release];
    [super dealloc];
}

-(void) viewDidLoad{
    NSArray *array = [[NSArray alloc] initWithObjects:@"Toy Story",
                      @"A Bug's Life",@"Toy Story 2",@"Monsters, Inc.",@"Finding Nemo",@"The Incredibles",@"Cars",@"Rataouille",@"WALL-E", @"Up",nil ];
    self.list = array;
    [array release];
    [super viewDidLoad];
}

-(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] initWithFrame:CGRectZero reuseIdentifier:DisclosureButtonCellIdentifier] autorelease];
        
    }
    NSUInteger row = [indexPath row];
    NSString *rowString = [list objectAtIndex:row];
    cell.text = rowString;
    [rowString release];
    return cell;
}

- (UITableViewCellAccessoryType) tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryDetailDisclosureButton;
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Do you see the disclosure button" message:@"touch" delegate:nil cancelButtonTitle:@"Don't" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];
}

- (void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    if (childController == nil) {
        childController = [[DisclosureDetailController alloc] initWithNibName:@"DisclosureDetailController" bundle:nil];
    }
    childController.title = @"Title";
    NSUInteger row = [indexPath row];
    NSString *selectedMovie = [list objectAtIndex:row];
    NSString *detailMessage = [[NSString alloc ] initWithFormat:@"you",selectedMovie];
    //childController.message = detailMessage;
    childController.title = selectedMovie;
    [detailMessage release];
    NavAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.navController pushViewController:childController animated:YES];
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值