文档章节

iphone练习之TableView

 杨勇汉
发布于 2015/02/01 14:05
字数 1075
阅读 4
收藏 0

1、第一个要实现的效果如图:


新建一个基于Sigle view Application的项目,拖一个Table View到View上,实现Outlets:dataSource、delegate到File's Owner。

实现代码:

#import <UIKit/UIKit.h>
//为了填充表格,必须使用一个协议,并且实现协议中的两个方法
@interface ViewController : UIViewController<UITableViewDataSource>

@end

#import "ViewController.h"

@implementation ViewController
NSMutableArray *listOfMovies;
//设置table中的信息,行的单元格在索引路径
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *CellIdentifier=@"Cell";
    //设置重复用的电池
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil){
        cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
        
    }
    //设置一行cell显示的值
    NSString *cellValue=[listOfMovies objectAtIndex:indexPath.row];
    cell.textLabel.text=cellValue;
    //添加图片
    UIImage *image=[UIImage imageNamed:@"ic_ic.jpg"];
    cell.imageView.image=image;
    return cell;
}
//节的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [listOfMovies count];
}
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    //显示页眉
    return @"Movie List";
}
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    //显示页脚
    return @"by Denzel Washington";
}
//选择在指数径行
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //得到选中该行的内容
    NSString *movieSelected=[listOfMovies objectAtIndex:indexPath.row];
    //封装成msg
    NSString *msg=[NSString stringWithFormat:@"You have selected %@",movieSelected];
    //用警告框弹出
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Movie selected" message:msg delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
    //显示弹出对话框
    [alert show];
    //释放alert
    [alert release];
}
//缩进水平排在索引路径
-(NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath{
    return [indexPath row]%2;
}
//在索引路径为行高度
-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 70;
}
- (void)viewDidLoad
{
    listOfMovies=[[NSMutableArray alloc]init];
    [listOfMovies addObject:@"Training Day"];
    [listOfMovies addObject:@"Remember the Titans"];
    [listOfMovies addObject:@"John Q."]; 
    [listOfMovies addObject:@"The Bone Collector"];
    [listOfMovies addObject:@"Ricochet"]; 
    [listOfMovies addObject:@"The Siege"]; 
    [listOfMovies addObject:@"Malcolm X"];
    [listOfMovies addObject:@"Antwone Fisher"]; 
    [listOfMovies addObject:@"Courage Under Fire"];
    [listOfMovies addObject:@"He Got Game"]; 
    [listOfMovies addObject:@"The Pelican Brief"]; 
    [listOfMovies addObject:@"Glory"];
    [listOfMovies addObject:@"The Preacher’s Wife"];
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}
-(void)dealloc{
    [listOfMovies release];
    [super dealloc];
}

我只给出相应的方法实现!

2、第二种实现效果


新建一个基于Master-Detail Application;在文件里新建一个 Property List类型的文件名为Movies.plist,内容如下:


实现代码:

#import <UIKit/UIKit.h>

@class DetailViewController;

@interface MasterViewController : UITableViewController{
    NSDictionary *movieTitles;
    NSArray *years;
}
@property (nonatomic,retain)NSDictionary *movieTitles;
@property (nonatomic,retain)NSArray *years;
@property (strong, nonatomic) DetailViewController *detailViewController;

@end

#import "MasterViewController.h"
#import "DetailViewController.h"

@implementation MasterViewController
@synthesize movieTitles,years;

- (void)dealloc
{
    [_detailViewController release];
    [movieTitles release];
    [years release];
    [super dealloc];
}

- (void)viewDidLoad
{
    //文件名字及类型
    NSString *path=[[NSBundle mainBundle]pathForResource:@"Movies" ofType:@"plist"];
    //获取内容为字典类型
    NSDictionary *dic=[[NSDictionary alloc]initWithContentsOfFile:path];
    //把所有内容赋给movieTitles
    self.movieTitles=dic;
    [dic release];
    /*获取所有的年份,并且升序键
     2000,
    2001,
    2002,
    2004,
    2006,
    2007,
    2008*/    
    NSArray *array=[[self.movieTitles allKeys]sortedArrayUsingSelector:@selector(compare:)];
    //赋给数组年
    self.years=array;    
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    //返回多少总行
    return [self.years count];
}
//每节的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    //获取每一年
    NSString *year=[self.years objectAtIndex:section];
    //获取每个年里的值,得到一个数组
    NSArray *movieSection=[self.movieTitles objectForKey:year];
    //返回这个键总共有多少值
    return [movieSection count];
}
//添写每一节的内容
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];            
    if(cell==nil){
        cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
    }
    //获取每一年
    NSString *year=[self.years objectAtIndex:[indexPath section]];
   //获取每年里的值
    NSArray *movieSection=[self.movieTitles objectForKey:year];
   //设置每一节里的内容
    cell.textLabel.text=[movieSection objectAtIndex:[indexPath row]];
    return cell;
}
//年的页眉
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    NSString *year=[self.years objectAtIndex:section];
    return year;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.detailViewController) {
        self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease];
    }
    [self.navigationController pushViewController:self.detailViewController animated:YES];
}


打开MasterViewController.xib文件把Table View的属性Style改成Grouped,并在MasterViewController.m添加一个索引方法如下代码:

//有时候列表过长,添加此方法实现索引,按每一年索引
-(NSArray*)sectionIndexTitlesForTableView:(UITableView *)tableView{
    return years;
}
实现的效果如下图:


下面是切换到另一个节目,并把电影的名字带回去:

首先在DetailViewController.m文件中添加如入代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *year = [self.years objectAtIndex:[indexPath section]];
    NSArray *movieSection = [self.movieTitles objectForKey:year];
    NSString *movieTitle = [movieSection objectAtIndex:[indexPath row]];
    NSString *message = [[NSString alloc]initWithFormat:@"%@", movieTitle];
    
    if (!self.detailViewController) {
        self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease];
    }
    self.detailViewController.movieSelected=message;
    [self.navigationController pushViewController:self.detailViewController animated:YES];
}


在DetailViewController.xib文件中添加一个label;

在DetailViewController.h文件中添加如下信息:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController{
    NSString *movieSelected;//电影的名字
    IBOutlet UILabel *label;
}

@property (strong, nonatomic) id detailItem;

@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (nonatomic,retain)NSString *movieSelected;

@property (nonatomic,retain)IBOutlet UILabel *label;

@end

在DetailViewController.m文件中添加:

@interface DetailViewController ()
- (void)configureView;
@end

@implementation DetailViewController

@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;
@synthesize movieSelected,label;
- (void)dealloc
{
    [_detailItem release];
    [_detailDescriptionLabel release];
    [movieSelected release];
    [super dealloc];
}

- (void)viewDidLoad
{
    self.navigationItem.title = movieSelected;
    label.text=movieSelected;
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    [self configureView];
}

实现效果图:



本博客是我自己的练习,有好多地方没有讲太清楚,还请谅解!


本文转载自:http://blog.csdn.net/rhljiayou/article/details/7532440

粉丝 2
博文 69
码字总数 0
作品 0
东城
私信 提问
iphone练习之TableView

1、第一个要实现的效果如图: 新建一个基于Sigle view Application的项目,拖一个Table View到View上,实现Outlets:dataSource、delegate到File's Owner。 实现代码: 我只给出相应的方法实...

长平狐
2013/12/25
140
0
iPhone X 适配 ( iOS 11适配 ) 打理刘海

这是一个故事: 故事背景 iPhone X 刘海机于9月份发布以来,备受诟病,给科技带来一个宴会.给coder却带来一份淡淡的凉意---> 怎么适配呢? 我们的APP会不会被遮住,多出来一个刘海? 我们底下的Tab...

iOS_xuanhe
2017/12/08
0
0
UITableViewCell 分割线

表格分割线大家懂的,默认并不是从最左侧开始的 在ipad中,发现,分割线距离最左和最右侧,都有距离 在iphone中,只有左侧有空隙 去掉分割线:设置UITableView的separatorStyle = UITableVie...

asjoker
2016/01/19
78
0
自己手写代码实现下拉刷新(对于小项目第三方库太占资源)

需要包装viewController视图 viewController.m代码全部粘贴即可使用 // // ViewController.m // 练习 刷新数据 // // Created by qianfeng on 16/2/24. // Copyright © 2016年 mc. All righ......

Matsonga
2016/02/24
97
0
javaFx中tableview如何添加checkbox并获取选中行

想拿javaFx练习做一个简单的增删改查,,可是在tableview中如何加入CheckBox并判断是都行是否被选中,目前用的如下方式:colSelect.setCellFactory(CheckBoxTableCell.forTableColumn(colSe...

Mrling
2016/11/11
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
43分钟前
3
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部