您的位置:首页 > 大数据 > 人工智能

基于tabBar类似mail多选删除的纠结实现

2011-08-21 23:44 387 查看
本来tableview多选删除是天经地义的事儿。在tabbar中想使用tableview的多选删除也没啥不对。纠结就纠结在想在tabbar中使用tableview多选删除的时候要实现类似系统自带的mail多选删除的效果。好吧,既然产品是这么设计的,合理不合理是一回事儿,能不能实现却是我的事儿,抱着“只要能实现,我就能实现的信念”,纠结了七八个小时,终于把这个不起眼的小效果搞定了。

开始界面





点了编辑以后。





选择要删除的行





点删除以后的效果





点清空以后的效果





点确定以后的效果





核心代码除了实现tabbar多选删除效果的以外,增加一个隐藏tabbar,一个在toolbar添加两个删除按钮及相关的处理方法。

- (void) hideTabBar:(BOOL) hidden{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0];
for(UIView *view in self.tabBarController.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
if (hidden) {
[view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
} else {
[view setFrame:CGRectMake(view.frame.origin.x, 480-49, view.frame.size.width, view.frame.size.height)];
}
}
else
{
if (hidden) {
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
} else {
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480-49)];
}
}
}
[UIView commitAnimations];
}
- (void)buttonClicked:(id)sender{
switch ([sender tag]) {
case 1:
//NSLog(@"要删除喽");
[dataArray removeObjectsInArray:[deleteDic allKeys]];

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithArray:[deleteDic allValues]] withRowAnimation:UITableViewRowAnimationFade];
[deleteDic removeAllObjects];
break;
case 2:
//NSLog(@"要清空喽");
; NSMutableArray *tmpArray = [[NSMutableArray alloc] init];

int end = [dataArray count];
for (int i = 0; i<end; i++) {
[tmpArray addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}

[dataArray removeAllObjects];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithArray:tmpArray] withRowAnimation:UITableViewRowAnimationFade];
[tmpArray release];
break;
default:
break;
}
}
- (void)clearAllHistory{
if (self.navigationItem.rightBarButtonItem.title == @"编辑") {

//隐藏tabbar
[self hideTabBar:YES];
//显示toolbar
self.navigationController.toolbar.barStyle = UIBarStyleBlack;
self.navigationController.toolbarHidden = NO;

if (selectBtn == nil) {
UIButton *myBtn1 = [UIButton buttonWithType:UIBarButtonItemStylePlain];
selectBtn = myBtn1;
myBtn1.frame = CGRectMake(0.0f, 0.0f, 80.0f, 30.0f);
[myBtn1 setTitle:@"删除(0)" forState:UIControlStateNormal];
[myBtn1 setTag:1];
[myBtn1 setBackgroundImage:[UIImage imageNamed:@"bbg.png"] forState:UIControlStateNormal];
[myBtn1 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
deleteBtn =[[UIBarButtonItem alloc] initWithCustomView:myBtn1];

UIButton *myBtn2 = [UIButton buttonWithType:UIBarButtonItemStylePlain];
myBtn2.frame = CGRectMake(0.0f, 0.0f, 80.0f, 30.0f);
[myBtn2 setTitle:@"清空" forState:UIControlStateNormal];
[myBtn2 setTag:2];
[myBtn2 setBackgroundImage:[UIImage imageNamed:@"bbg.png"] forState:UIControlStateNormal];
[myBtn2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
clearBtn = [[UIBarButtonItem alloc] initWithCustomView:myBtn2 ];

spaceBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
}

[self.navigationController.toolbar setItems:[NSArray arrayWithObjects:spaceBtn,spaceBtn,deleteBtn,clearBtn,spaceBtn,spaceBtn,nil]  animated:YES];
self.navigationItem.rightBarButtonItem.title = @"确定";
[self.tableView setEditing:YES animated:YES];
}
else {
self.navigationItem.rightBarButtonItem.title = @"编辑";
self.navigationController.toolbarHidden = YES;
[self hideTabBar:NO];
[deleteDic removeAllObjects];
[self.tableView setEditing:NO animated:YES];
}
}

整个效果实现起来的难点有三个:
1.tabbar的隐藏。
作为要控制器,它竟然不允许自己被隐藏。弄来弄去,最后隐藏toolbar的方法用的是cocochina的laigb提供的方法。http://www.cocoachina.com/bbs/read.php?tid=25042&page=3#206318.不过laigb用的y的值为320.应该是iphone4以前的设备要用这个值吧。
2.两个删除按钮的相对居中
toolbar默认添加的按钮是从左相右排列的。添加两个的话,就默认跑到最左边了。所以这个地方要使用占位符。
3.修改标签:"删除(0)"
这个地方纠结的地方有两处,1)保存这个按钮的引用,方便修改其值;2)修改它的值的时候发现,必需选用"删除(0)"占位,不然后面再修改成类似"删除(1)"的时候,显示不全。

本文出自 “rainbird” 博客,请务必保留此出处http://rainbird.blog.51cto.com/211214/645772
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: