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

本来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提供的方法。不过laigb用的y的值为320.应该是iphone4以前的设备要用这个值吧。
2.两个删除按钮的相对居中
toolbar默认添加的按钮是从左相右排列的。添加两个的话,就默认跑到最左边了。所以这个地方要使用占位符。
3.修改标签:”删除(0)”
这个地方纠结的地方有两处:
1)保存这个按钮的引用,方便修改其值;
2)修改它的值的时候发现,必需选用”删除(0)”占位,不然后面再修改成类似”删除(1)”的时候,显示不全。


相关博文

    分享到:

About rainbird

IOS攻城狮
This entry was posted in IOS开发, object-c, xCode, 原创 and tagged , , , , , , , , . Bookmark the permalink.

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

  1. Pingback: 关于UIButton的一些新认识 | rainbird's blog

发表评论