抽屉开关控制器
1、实现UITableView类似抽屉开关控制器的功能
2、使用NSUserDefaults实现cell中输入UIfield的保存功能
// RootViewController.h
#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate>
@property(nonatomic,retain)NSString *first;
@property(nonatomic,retain)NSString *second;
@property(nonatomic,retain)NSString *third;
@end
// RootViewController.m
#import "RootViewController.h"
#import "TableViewCell.h"
#import "WriteTableViewCell.h"
@interface RootViewController ()
{
UITableView*table;
NSMutableArray*arr;
NSMutableArray*dataSource;
NSInteger count;
NSInteger tag;
WriteTableViewCell *cell;
NSMutableDictionary *dic;
}
@property (strong, nonatomic) NSArray *sectionHeaderArr;
@property (strong, nonatomic) NSArray *bodyArr;
@property (strong, nonatomic) NSMutableArray *selectedTagArr;
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.sectionHeaderArr = @[@"header1",
@"header2",
@"header3",
@"header4"];
self.bodyArr =@[@[@"h1_body1",@"h1_body2",@"h1_body3"],
@[@"h2_body1",@"h2_body2",@"h2_body3"],
@[@"h3_body1",@"h3_body2",@"h3_body3"],
@[@"h4_body1",@"h4_body2",@"h4_body3"]];
//抽屉开关控制器
//mutableCopy 深拷贝 之后可以改变数组里面的
self.selectedTagArr = @[@"NO",
@"NO",
@"NO",
@"NO"].mutableCopy;
dic=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",[NSNumber numberWithInt:4],@"4", nil];
table=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
table.delegate=self;
table.dataSource=self;
[table setEditing:YES];
//new This method is a combination of alloc and init.
//两种方法都行 new c语言用的多
//[table setTableFooterView:UIView.new];
//创建table FooterView新的视图(为空), 可消除单元格下面的横线
[table setTableFooterView:[UIView new]];
//所有单元格下面的横线消失
[table setSeparatorStyle:UITableViewCellSeparatorStyleNone];
//默认是不控制是否可以在多行编辑模式,同时选择
//[table setAllowsMultipleSelectionDuringEditing:YES];
//是否支持编辑
//[table setEditing:NO];
[self.view addSubview:table];
[self tableHeaderViewData]; //创建header视图
[self tableFooterViewData]; //创建footer视图
NSArray *arr22=@[@"添加数据库",@"删除数据库"];
for (int i=0; i<2; i++) {
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
btn.backgroundColor=[UIColor cyanColor];
[btn setTitle:arr22[i] forState:UIControlStateNormal];
btn.frame=CGRectMake(0+110*i, 70, 100, 50);
btn.tag=i;
[btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(220, 70, 200, 50)];
label.backgroundColor=[UIColor cyanColor];
[self.view addSubview:label];
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"test"])
{
label.text = @"这不是第一次运行";
}
else
{
label.text = @"这是第一次运行";
//将键值对写入userDefaults中
[defaults setObject:@"message" forKey:@"test"];
//将usersDefaults存放在磁盘上 但是不是必须要进行的操作
[defaults synchronize];
}
}
-(void)pressBtn:(id)sender
{
UIButton *btn=(UIButton *)sender;
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
if (btn.tag==0) {
//添加userDefaults下键值对
[userDefaults setObject:_first forKey:@"0"];
[userDefaults setObject:_second forKey:@"1"];
[userDefaults setObject:_third forKey:@"2"];
[userDefaults setObject:dic forKey:@"dic"];
[userDefaults synchronize];
NSArray * arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * path = [arr1 objectAtIndex:0];
NSLog(@"1111%@",path);
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"添加本地数据成功" message:nil delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
}
else
{
[userDefaults removeObjectForKey:@"0"];
[userDefaults removeObjectForKey:@"1"];
[userDefaults removeObjectForKey:@"2"];
[userDefaults removeObjectForKey:@"test"];
//因为数据读取 第二次就是从磁盘的plist文件读取 我们上面的代码只是删除沙盒路径下的plist文件的内容
[userDefaults synchronize];
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"删除本地数据成功" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
[alert show];
}
}
// tableHeaderView定义的View, 常用来做顶部轮播图片
-(void)tableHeaderViewData
{
UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
image.backgroundColor = [UIColor greenColor];
table.tableHeaderView=image;
}
// tableFooterView定义的View, 常用来做底部上拉加载更多
-(void)tableFooterViewData
{
UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
image.backgroundColor = [UIColor greenColor];
table.tableFooterView=image;
}
//如果不选择 默认为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [_sectionHeaderArr count];
}
//标题的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 40;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIButton *headerBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[headerBtn setFrame:CGRectMake(0, 0, tableView.frame.size.width, 40)];
[headerBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[headerBtn setTitle:_sectionHeaderArr[section] forState:UIControlStateNormal ];
[headerBtn setTag:section];
[headerBtn addTarget:self action:@selector(headerClickAction:) forControlEvents:UIControlEventTouchUpInside];
return headerBtn;
}
- (void)headerClickAction:(UIButton *)sender
{
tag = sender.tag;
//boolValue bool数值
BOOL isSelected = [_selectedTagArr[tag] boolValue];
//更改开关控制器
[_selectedTagArr replaceObjectAtIndex:tag withObject:@(!isSelected)];
[table reloadData];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//点击 header 按钮 是否显示抽屉
if ([_selectedTagArr[section] boolValue])
return [_bodyArr[section] count];
else
return 0;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//这样简化即可
// TableViewCell*cell=[[[NSBundle mainBundle]loadNibNamed:@"TableViewCell" owner:self options:nil] lastObject];
if (indexPath.section==1) {
cell =[[[NSBundle mainBundle]loadNibNamed:@"WriteTableViewCell" owner:self options:nil] lastObject];
//cell.textLabel.text= _bodyArr[indexPath.section][indexPath.row];
cell.titleText.text=_bodyArr[indexPath.section][indexPath.row];
cell.textField.tag=indexPath.row+10;
[cell.textField addTarget:self action:@selector(textFieldWithText:) forControlEvents:UIControlEventEditingChanged];
return cell;
}
else if (indexPath.section==0)
{
cell =[[[NSBundle mainBundle]loadNibNamed:@"WriteTableViewCell" owner:self options:nil] lastObject];
//cell.textLabel.text= _bodyArr[indexPath.section][indexPath.row];
cell.textField.tag=indexPath.row+20;
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSString*number=[[NSString alloc]initWithFormat:@"%ld",(long)cell.textField.tag];
if ([number isEqualToString:@"20"]) {
cell.textField.text=[defaults objectForKey:@"0"];
}
else if ([number isEqualToString:@"21"]){
cell.textField.text=[defaults objectForKey:@"1"];
}
else
{
cell.textField.text=[defaults objectForKey:@"2"];
}
[cell.textField addTarget:self action:@selector(textFieldWithText:) forControlEvents:UIControlEventEditingChanged];
return cell;
}
else
{
TableViewCell*cell1=[[[NSBundle mainBundle]loadNibNamed:@"TableViewCell" owner:self options:nil] lastObject];
cell1.textLabel.text=_bodyArr[indexPath.section][indexPath.row];
return cell1;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)textFieldWithText:(UITextField *)textField
{
switch (textField.tag) {
case 10:
_first = textField.text;
NSLog(@"_first=%@",_first);
break;
case 11:
_second = textField.text;
NSLog(@"_second=%@",_second);
break;
case 12:
_third = textField.text;
NSLog(@"_third=%@",_third);
break;
case 20:
_first = textField.text;
NSLog(@"_first=%@",_first);
break;
case 21:
_second = textField.text;
NSLog(@"_second=%@",_second);
break;
case 22:
_third = textField.text;
NSLog(@"_third=%@",_third);
default:
break;
}
}