转自http://blog.sina.com.cn/s/blog_aa6603d2010191yt.html
目标:
这次的学习是在Navigation-based Application模板中,用RootViewController class设置操作方法,使用UITableView的属性值。在导航控制器控件为程序的窗口添加上导航条,可构建多个视图连接导航按钮。这次的练习中,我在Navigation controller控件加入两个导航按钮,屏幕左上角Add按钮为表格添加新的一行,右上角Edit按钮为表格删除一行或者移动每行的顺序。当user点击edit按钮后,便会进入到编辑的视图,当user想要回到原先的视图便点击Done完成编辑。
ViewController.m文件
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
IBOutlet UITableView *rootTableView;
IBOutlet UIButton *editButton;
NSMutableArray *dataArray;
UITextField *rowField;
}
@property (nonatomic,retain) NSMutableArray *dataArray;
@property (nonatomic, retain) UITextField *rowField;
@property (nonatomic, retain) IBOutlet UITableView *rootTableView;
@property (nonatomic, retain) IBOutlet UIButton *editButton;
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize rootTableView;
@synthesize dataArray;
@synthesize editButton;
@synthesize rowField;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//定义内容文字
dataArray = [[NSMutableArray alloc] initWithObjects:@"Row1", @"Row2",@"Row3",@"Row4",@"Row5", nil];
//建立add按钮
UIBarButtonItem *addButton = [[UIBarButtonItem alloc]
initWithTitle:@"Add"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(AddButtonAction:)];
self.navigationItem.leftBarButtonItem = addButton;
}
//构建操作方法,点击按钮执行
-(IBAction) EditButtonAction:(id)sender
{
// [rootTableView setEditing: YES
// animated: YES];
if ([sender tag] == 1) {
[editButton setTitle:@"Done" forState:UIControlStateNormal];
[editButton setTag:2];
[rootTableView setEditing:YES animated:YES];
}else if ([sender tag] == 2){
[editButton setTitle:@"Edit" forState:UIControlStateNormal];
[editButton setTag:1];
[rootTableView setEditing:NO animated:YES];
}
}
//添加addbutton
-(IBAction)AddButtonAction:(id)sender
{
UIAlertView *dialog = [[UIAlertView alloc] initWithTitle:@"添加一行"
message:@""
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"确定", nil];
rowField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 38.0, 245.0, 20.0)];
[rowField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:rowField];
[dialog show];
[dialog release];
[rowField release];
}
-(void) alertView: (UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ((buttonIndex != [alertView cancelButtonIndex]) && (rowField.text != nil)) {
[dataArray insertObject:[rowField text] atIndex:dataArray.count];
[self.rootTableView reloadData];
}
}
//表格中分组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 2;
}
//表格中行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//表格中行数等于数组内容的个数
if (section ==0) {
return dataArray.count;
}
if (section ==1)
{
return 0;
}
else {
return 0;
}
}
//分组标题内容设置
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
//创建字符变量title
NSString *title = nil;
switch (section) {
case 0:
title = @"表格一";
break;
case 1:
title = @"表格二";
break;
default:
break;
}
return title;
}
//显示表格每一行内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//创建一个字符变量,用于取得文本数据类型
static NSString *CellIndentifier = @"cell";
//建立表格行数单元格
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier];
//当cell为空时
if (cell == nil)
{
//为cell重新获取表格内容标识符
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIndentifier] autorelease];
}
//分组section为0
if (indexPath.section ==0)
{
cell.textLabel.text =
[dataArray objectAtIndex:indexPath.row];
}
return cell;
}
//编辑
-(BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
//调整
-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete)
{
//删除
[dataArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
}
//上下行移动
-(void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
[dataArray insertObject:[dataArray objectAtIndex:sourceIndexPath.row]
atIndex:destinationIndexPath.row];
[dataArray removeObjectAtIndex:(NSUInteger) sourceIndexPath.row+1];
}
//让表格内容位置调整的方法
-(BOOL) tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
-(void) dealloc
{
[rootTableView release];
rootTableView = nil;
[rowField release];
[dataArray release];
dataArray = nil;
[editButton release];
editButton = nil;
[super dealloc];
}
@end
转自:http://www.2cto.com/kf/201312/266716.html
ios表格的操作
一:1、首先在RootViewController类中需要遵从三个协议:;然后定义两个对象:@property (retain,nonatomic)UITableView *mTableView;
@property (retain,nonatomic)NSArray *Arr;
2、其中对数组初始化,为方便利用系统封装好的一个:self.Arr=[UIFont familyNames];
对mTableView初始化:self.mTableView=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
//设置页眉高度
self.mTableView.sectionHeaderHeight=40;
//设置委托对象
self.mTableView.dataSource=self;
self.mTableView.delegate=self;
3、UITableViewDataSource协议中两个必须实现的方法:
//每个分段中动行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.Arr count];
}
//每行动绘制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifer=@"identifer";
UITableViewCell *pCell=[tableView dequeueReusableCellWithIdentifier:identifer];
if (nil==pCell) {
pCell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifer];
}
//获取当前行
NSUInteger cellRow=[indexPath row];
//根据行数找到数组中对应下标动数据
NSString *pTempStr=[self.Arr objectAtIndex:cellRow];
//设置文本内容
pCell.textLabel.text=pTempStr;
//设置文本字体
pCell.textLabel.font=[UIFont fontWithName:pTempStr size:18];
pCell.detailTextLabel.text=@"detailText";
pCell.imageView.image=[UIImage imageNamed:@"Default-568h@2x"];
pCell.accessoryType=UITableViewCellAccessoryCheckmark;
return pCell;
}
4、UITableViewDelegate协议中几个对表格某些属性加以描述的方法:
//选中某行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSUInteger row=[indexPath row];
NSString *pStr=[NSString stringWithFormat:@"你选中了第%d行",row];
//模态视图
UIActionSheet *pActionSheet=[[UIActionSheet alloc]initWithTitle:@"ActionSheet"delegate:self cancelButtonTitle:@"确认" destructiveButtonTitle:pStr otherButtonTitles:nil, nil];
[pActionSheet showInView:self.view];
//选中行逐渐淡出
[self.mTableView deselectRowAtIndexPath:indexPath animated:YES];
}
//调整行高方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 88;
}
//调整页眉高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 40;
}
二、对表格内容的编辑以及在表格视图中实现搜索功能:
1、对表格内容进行编辑:除了之前所学过的创建表格视图的内容,还增加了以下内容及代码:
在昨天创建表格视图的基础上,需要新建一个类MyCell,将类MyCell导入到类ViewController的.m文件里
在类MyCell中建两个Label对象和一个Button(可以由自己决定建多少对象),他们的初始化以及加载到视图过程就省略不提了,重点是将MyCell类导入到类ViewController中所做的与昨天的改变之处:
其他基本不变,主要改变的是如下:
//绘制行
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifer=@"identifer";
MYCell *pCell=(MYCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (nil==pCell) {
pCell=[[MYCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifer];
}
pCell.NameLable.text=@"name";
pCell.ColorLable.text=@"color";
return pCell;
}
注意其中有一个转换,注意不要忘。
2、在表格中实现搜索功能:
注意此时ViewController遵从的是两个协议;定义四个对象:
UITableView *mTableView;UISearchBar *mSeachBar;
NSMutableArray *Arr1; NSMutableArray *Arr2;
其中表视图初始化步骤省略,以下所增加代码:
//searchbar初始化
self.mSeachBar=[[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.mTableView.frame.size.width, 30)];
self.mSeachBar.delegate=self;
//设置当前表格的头视图
self.mTableView.tableHeaderView=self.mSeachBar;
[self.view addSubview:self.mTableView];
//初始化两个可变数组
self.Arr1=[[NSMutableArray alloc]initWithCapacity:60];
self.Arr2=[[NSMutableArray alloc]initWithCapacity:60];
for (int i=0; i<60; i++) {
NSString *pTempStr=[NSString stringWithFormat:@"%d",i];
[self.Arr1 addObject:pTempStr];
[self.Arr2 addObject:pTempStr];
}
行数返回值变为:return [self.Arr2 count];
绘制每行中其中一些代码:
//给每行加载标题(通过数组2的内容进行添加)
NSInteger row=[indexPath row];
pCell.textLabel.text=[self.Arr2 objectAtIndex:row];
//实现搜索功能的方法
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
[self.Arr2 removeAllObjects];
for (NSString *str in self.Arr1){
if ([str hasPrefix:self.mSeachBar .text]) {
[self.Arr2 addObject:str];
}
}
[self.mSeachBar resignFirstResponder];
[self.mTableView reloadData];
}
三、表格的添加和删除操作以及对表格实现分组操作
1、对表格实现添加和删除操作功能:
与之前我们所学表格内容主要不同点是:在ViewController类中定义了一个可变数组,以及在视图中加了一个导航,导航右上上方有一按钮。
//初始化导航按钮
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
if (self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
self.navigationItem.title=@"首页";
UIBarButtonItem *pBtnItem=[[UIBarButtonItem alloc]initWithTitle:@"BegEdit" style:UIBarButtonItemStylePlain target:self action:@selector(tableViewEdit:)];
self.navigationItem.rightBarButtonItem=pBtnItem;
}
return self;
}
//设置导航按钮标题:
- (void)tableViewEdit:(id)sender{
[sender setTitle:[self.mTableView isEditing]?@"BegEdit":@"EditEdit"];
[self.mTableView setEditing:![self.mTableView isEditing]];
}
//表格是否可编辑:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
if ([indexPath row]==0) {
return NO;
}
return YES;
}
//每行编辑方式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if ([indexPath row] % 2) {
return UITableViewCellEditingStyleDelete;
}
return UITableViewCellEditingStyleInsert;
}
//删除和增加方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if (editingStyle==UITableViewCellEditingStyleDelete) {
//在数组中移出对象
[self.mArr removeObjectAtIndex:[indexPath row]];
[self.mTableView beginUpdates];
[self.mTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight ];
[self.mTableView endUpdates];
}else if(editingStyle==UITableViewCellEditingStyleInsert){
[self.mArr insertObject:@"newCell" atIndex:[indexPath row]];
[self.mTableView beginUpdates];
[self.mTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom ];
[self.mTableView endUpdates];
}
}
//是否可以移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
if ([indexPath row]==2) {
return NO;
}
return YES;
}
//移动方法:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
//获取移动前的行
NSUInteger fromRow=[sourceIndexPath row];
//将要移动到的行
NSUInteger toRow=[destinationIndexPath row];
//获取数组中移动前下标对应的对象
id obj=[self.mArr objectAtIndex:fromRow];
//从数组中删除
[self.mArr removeObjectAtIndex:fromRow];
//在新的位置加入
[self.mArr insertObject:obj atIndex:toRow];
}
注意表格行数返回的是:return [self.mArr count];
每行表格标题设为:NSUInteger row=[indexPath row];
pCell.textLabel.text=[self.mArr objectAtIndex:row];
2、对表格实现分组:
首先建一个表格视图,注意所建的表格视图风格是:UITableViewStyleGrouped;
然后创建一个plist文件,创建方法省略(在resource里面选中property list,然后创建),在plist文件写入自己想在分组表格中显示的内容。
获取plist文件路径,并将它赋值给字典,然后将字典中的内容分配给数组,实现代码如下:
NSString *path=[[NSBundle mainBundle]pathForResource:@"Data" ofType:@"plist"];
self.mDic=[NSDictionary dictionaryWithContentsOfFile:path];
self.mArr=[[self.mDic allKeys]sortedArrayUsingSelector:@selector(compare:)];
此时创建的表格视图每组中行数返回值为:return [[self.mDic objectForKey:[self.mArr objectAtIndex:section]]count];
绘制每行时每行的标题:pCell.textLabel.text=[[self.mDic objectForKey:[self.mArr objectAtIndex:section]]objectAtIndex:row];
//每组的标签:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return [self.mArr objectAtIndex:section];
}
//右侧索引栏的添加方法:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return self.mArr;
}
而组数返回值为:return [self.mArr count];