UITableView
- 表视图的每一条数据都是显示在UITableViewCell对象中
分区显示数据, 每一个分区称为一个section, 每一行称为row, 编号都是从0开始
DataSource数据源
-我们需要给tableView指定一个数据源, 它负责给tableView提供数据, 需要实现协议中两个必须实现的方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSinteger)section
- (UITableVIewCell *)tableView:(UItableView *)tableView cellForRowARIndexPath:(NSIndexPath *)indexPath
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AppDelegate.m 文件
#import "AppDelegate.h"
#import "MainViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)dealloc
{
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
[_window release];
MainViewController *mainVC = [[MainViewController alloc]init];
UINavigationController *naVC = [[UINavigationController alloc]initWithRootViewController:mainVC];
self.window.rootViewController = naVC;
[mainVC release];
[naVC release];
return YES;
}
MainViewController.m 文件
#import "MainViewController.h"
#import "SecondViewController.h"
@interface MainViewController ()<UITableViewDataSource, UITableViewDelegate>
@property(nonatomic, retain)NSMutableArray *arr;
@end
@implementation MainViewController
- (void)dealloc
{
[_arr release];
[super dealloc];
}
// 重写初始化方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
// 方法1
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.arr = [NSMutableArray arrayWithObjects:@"宋江1", @"卢俊义2", @"吴用3", @"公孙胜4", @"关胜5", @"林冲6", @"秦明7" ,@"呼延灼8" , @"花容9",@"柴进10", @"李应11", @"朱仝12",@"鲁智深13",@"武松14",nil];
}
// 方法2
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self createData];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor orangeColor];
self.navigationController.navigationBar.translucent = NO;
self.title = @"表视图";
// 创建UITableView (继承于UIScrollView 可以滚动)
// UITableView *tableView = [[UITableView alloc]
initWithFrame:self.view.frame style:UITableViewStylePlain];
UITableView *tableView = [[UITableView alloc]initWithFrame:
CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 64) style:UITableViewStylePlain];
tableView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:tableView];
[tableView release];
// 设置行高
tableView.rowHeight = 100;
// tableView的两套代理
tableView.dataSource = self;
tableView.delegate = self;
}
#pragma mark tableview里有多少个section (分区), 默认1个分区
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 10;
}
// #pragma mark tableview第一个必须实现的协议方法, 指定分区内有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// 方法1:让数组里的元素个数和行数保持相同
//return self.arr.count;
// 奇数分区有5行, 偶数分区有10行
// 先执行分区的方法, 后执行每个分区里有多少行
if(section % 2 == 1){
return 5;
}else{
return 10;
}
}
// #pragma mark 第二个协议方法, 主要是用来显示数据 (每一分区每一行显示的数据)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// static特点:
// 1.只初始化一次
// 2.如果没有初始值, 默认是0;
// 3.指导程序结束, 才会消失
// 创建cell
// 当cell 显示结束之后, 会把cell统一的放到重用池中, 等需要cell显示了, 先从重用池中找, 看有没有闲置的cell, 如果有的话就用闲置的cell, 如果没有再创建
// cell的重用是为了节约创建成本, 用有限的cell把所有的数据显示出来
// 1.给重用池设置一个重要标志, 根据这个标志可以找到对应的重用池
static NSString *reuse = @"reuse";
// 2.tableView通过重用标志在重用池中寻找cell, 如果有闲置的cell, cell会保存一个有效的cell对象地址, 如果没有, cell里面则是nil, 空
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuse];
// 3.如果没有cell, 则进行cell的创建
if (!cell) {
cell
= [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuse] autorelease];
}
// 对cell进行赋值
// celll里有默认的三个控件
// 1.大标题
cell.textLabel.text = @"宋江";
cell.textLabel.text = self.arr[indexPath.row];
// 2.小标题
cell.detailTextLabel.text = @"卢俊义";
cell.detailTextLabel.text = [NSString stringWithFormat:@"%ld", indexPath.section];
// 3.图片框
cell.imageView.image = [UIImage imageNamed:@"8.jpg"];
//indexPath.row保存的是行数
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return @"水浒";
}
#pragma mark 索引
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return @[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",];
}
//*************<UITableViewDelegate>********************************************
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"section:%ld, row:%ld", indexPath.section, indexPath.row);
// 打印当前点击的人名是什么
NSLog(@"%@", self.arr[indexPath.row]);
// 点击之后推出下一页
SecondViewController *secondVC = [[SecondViewController alloc]init];
[self.navigationController pushViewController:secondVC animated:YES];
[secondVC release];
}
给tableView添加头视图, 下拉时头视图变大
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"主界面";
self.navigationController.navigationBar.translucent = NO;
self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 64) style:UITableViewStylePlain];
self.tableView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:self.tableView];
[_tableView release];
self.tableView.rowHeight = 100;
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"10.jpg"]];
self.imageView.frame = CGRectMake(0, 0 -200 , self.view.frame.size.width, 200);
//给tableView添加头视图 (两种效果 对比)
//self.tableView.tableHeaderView = self.imageView; // 宽是tableView的宽度
[self.tableView addSubview:self.imageView];
self.tableView.contentInset = UIEdgeInsetsMake(200, 0, 0, 0);
}
#pragma mark tableview的delegate已经签订好scrollview的协议, 只要设置好代理人, 就可以使用scrollView的协议方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//NSLog(@"滑动");
//获取偏移量
CGFloat y = scrollView.contentOffset.y;
NSLog(@"%g", y);
if (y < 0) {
self.imageView.frame = CGRectMake(0, y, self.view.frame.size.width, -y);
}
}
界面传值 (后向前)
SecondViewController.h 文件
#import <UIKit/UIKit.h>
// 1.声明一份协议
@protocol SecondViewControllerDelegate <NSObject>
- (void)changeValue:(NSString *)str;
@end
@interface SecondViewController : UIViewController
// 2.设置代理人属性
@property(nonatomic, assign)id<SecondViewControllerDelegate>delegate;
@property(nonatomic, copy)NSString *name;
@end
SecondVIewController.m文件
- (void)click:(UIButton *)button{
// 3.
[self.delegate changeValue:self.textfield.text];
[self.navigationController popToRootViewControllerAnimated:YES];
}
MainViewController.m 文件
// 4.签协议
@interface MainViewController ()<UITableViewDataSource, UITableViewDelegate, SecondViewControllerDelegate>
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
SecondViewController *secVC = [[SecondViewController alloc]init];
[self.navigationController pushViewController:secVC animated:YES];
[secVC release];
secVC.name = self.arr[indexPath.row];
// 5. 设置代理人
secVC.delegate = self;
}
// 6.
-(void)changeValue:(NSString *)str
{
// 属性的数组, 相当于数据源, 把传过来的值添加到数组中
[self.arr addObject:str];
// 对tableview进行刷新操作
[self.tableView reloadData];
}