在上面文章中提到用UISegmentConTroller来切换不同的tableView,从逻辑和代码的质量上有很大的欠缺。该篇文章将两个tableView交由不同的控制器管理,在逻辑和事件的处理上更加清晰。
实现该方法需要使用到三个Controller:一个主页面控制器(SubmitListViewController),一个左tableView控制器(LeaveLeftTableViewController),一个右tableView控制器(LeaveRigthTableViewController)
#import "SubmitListViewController.h"
#import "LeaveLeftTableViewController.h"
#import "LeaveRigthTableViewController.h"
@interface SubmitListViewController (){
NSMutableDictionary *listDic;
}
@property (nonatomic,strong)LeaveLeftTableViewController *oneVC;
@property (nonatomic,strong)LeaveRigthTableViewController *twoVC;
@end
@implementation SubmitListViewController
//初始化左边的tableView
- (LeaveLeftTableViewController *)oneVC {
if (_oneVC == nil) {
_oneVC = [[LeaveLeftTableViewController alloc] init];
_oneVC.type = TypeSubMit;
__weak typeof(self)weakself = self;
_oneVC.leftBlock = ^(NSString *str){
MySubmitViewController *mySubmit = [[MySubmitViewController alloc]init];
mySubmit.change = NO;
[weakself.navigationController pushViewController:mySubmit animated:YES];
};
_oneVC.view.frame = CGRectMake(0, 64, AMPScreenWidth, AMPScreenheight-108);
}
return _oneVC;
}
//初始化右边的tableView
- (LeaveRigthTableViewController *)twoVC {
if (_twoVC == nil) {
_twoVC = [[LeaveRigthTableViewController alloc] init];
_twoVC.type = TypeSubMit;
__weak typeof(self)weakself = self;
_twoVC.rigthBlock = ^(NSString *str,NSString *assign){
MySubmitViewController *mySubmit = [[MySubmitViewController alloc]init];
mySubmit.change = YES;
[weakself.navigationController pushViewController:mySubmit animated:YES];
};
_twoVC.view.frame = CGRectMake(0, 64, AMPScreenWidth, AMPScreenheight-108);
}
return _twoVC;
}
//自动刷新tableview
- (void)viewWillAppear:(BOOL)animated {
if ([[self.view subviews] firstObject]== self.oneVC.tableView) {
[self.oneVC startRefresh];
}else {
[self.twoVC startRefresh];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
listDic = [NSMutableDictionary dictionary];
[self initSegment];
// Do any additional setup after loading the view.
}
- (void)initSegment{
//先生成存放标题的数据
NSArray *array = [NSArray arrayWithObjects:@" 我的 ",@" 审批 ", nil];
//初始化UISegmentedControl
UISegmentedControl *segment = [[UISegmentedControl alloc]initWithItems:array];
//根据内容定分段宽度
segment.apportionsSegmentWidthsByContent = YES;
//开始时默认选中下标(第一个下标默认是0)
segment.selectedSegmentIndex = 0;
//控件渲染色(也就是外观字体颜色)
segment.tintColor = [UIColor whiteColor];
// 设置指定索引选项的宽度(设置下标为2的分段宽度)
[segment setWidth:60.0 forSegmentAtIndex:0];
[segment setWidth:60.0 forSegmentAtIndex:1];
//添加事件
[segment addTarget:self action:@selector(change:) forControlEvents:UIControlEventValueChanged];
//添加到视图
self.navigationItem.titleView = segment;
// 默认显示OneVc的内容
[self.view addSubview:self.oneVC.view];
}
//根据字典中是否存在相关页面对应的key,没有的话存储
- (UIViewController *)controllerForSegIndex:(NSUInteger)segIndex {
NSString *keyName = [NSString stringWithFormat:@"VC_%ld",segIndex];
UIViewController *controller = (UIViewController *)[listDic objectForKey:keyName];
if (!controller) {
if (segIndex == 0) {//申请
controller = self.oneVC;
}else if (segIndex == 1) {//待办
controller = self.twoVC;
}
[listDic setObject:controller forKey:keyName];
}
return controller;
}
//点击不同分段就会有不同的事件进行相应
-(void)change:(UISegmentedControl *)sender{
NSUInteger segIndex = [sender selectedSegmentIndex];
UIViewController *controller = [self controllerForSegIndex:segIndex];
NSArray *array2 = [self.view subviews];
NSLog(@"array2-->%@",array2);
//将当旧VC的view移除,然后在添加新VC的view
if (array2.count != 0) {
if (segIndex == 0) {
[_twoVC.view removeFromSuperview];
NSLog(@"remove--oneVC");
}else if (segIndex == 1){
[_oneVC.view removeFromSuperview];
NSLog(@"remove--twoVC");
}
}
[self.view addSubview:controller.view];
//NSArray *sub = [self.view subviews];
//NSLog(@"sub-->%@",sub);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
代码中用到了两个block,和一个自动刷新
@interface LeaveLeftTableViewController : UITableViewController
typedef void(^leftCellselected)(NSString *str);
@property (nonatomic,assign)OAType type;
@property (nonatomic,copy)leftCellselected leftBlock;
- (void)startRefresh;
@end
LeaveLeftTableViewController.m中
- (void)startRefresh {
[self.tableView.mj_header beginRefreshing];
//该处集成MJRefresh
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
leaveModel = self.array[indexPath.row];
self.leftBlock(leaveModel.leaveid);
}