了解表视图之后,我们了解导航控制器,导航控制器和表视图没有必然的关联,但是在实际的运用当中他们是紧密相关的。
先了解一些基础知识。或者说是复习吧。
什么是栈?
栈是一种常用的数据结构,采用后进先出的原则。可以理解我们把书一本一本的装到箱子里面,当我们取的时候是把最后放进去的书最先拿出来。
向栈中添加对象叫入栈(push)即把对象推到栈中。
第一个入栈的对象叫基栈。
最有一个入栈的对象叫栈顶。
从栈中删除对象的操作叫出栈(pop)。
这个导航项目由6个部分组成
1、展示按钮视图。2、校验表视图。3、行控制视图。4、可移动行视图。5、可删除行视图。6、可编辑详细信息视图。
接下来就创建项目。
创建的是以一个Empty Application创建的。
创建顶级视图
首先要创建一个顶级类命名为BIDFirstLevelController。然后在BIDAppDelegate头文件中添加代码如下:
#import <UIKit/UIKit.h>
@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong,nonatomic) UINavigationController *navController;//初始化一个导航条
@end
#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];//这个方法可以用来创建一个普通的或时分组的的表视图控制器,而不用借助nib文件。
self.navController=[[UINavigationController alloc] initWithRootViewController:first];//传递顶层控制器,导航控制器用它来初始化内容
[self.window addSubview:navController.view];//它是由导航控制器所提供的符合视图,有两项组成,屏幕顶部的导航栏,以及下面所显示的内容
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
其实这两个文件是最基础的初始化数据的时候必须加载的。所以导航条要添加在这里,它第一次就要出现的。
接下来创建内容视图的,BIDFirstLevelViewController,这个我们不会去创建实例,它单独的存在,我们便可以向接下来编写的其他控制器添加常规项目。可以理解为是一个抽象类。
实现代码如下:
#import <UIKit/UIKit.h>
@interface BIDFirstLevelController : UITableViewController
@property (strong,nonatomic) NSArray *controllers;
@end
#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];
}
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
这样就可以运行了,效果如下:这样就是把导航条添加进去,由于数组为空所以只能看到空行。
由于最近比较忙,这个学习还是精力不足,缓慢前进,总比不动好,逆水行舟不进则退。我要努力。。。。。。