首页 > 代码库 > 小小记事本

小小记事本

页面很简单,是这个样子的.在点击tableviewCell 的时候, 右面的view可以自动弹出,在该view中输入以及显示输出,将该view拖回到右边时,刷新tableview.在重新打开程序的时候内容也仍然在.下面说一下实现过程吧

一.判断进入页面

即判断是否存在plist文件以及版本号是否相同,在AppDelegate.m中写入

-(void)addFirstPage

{

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    NSString *path = [NSFunction getDocConfigPath];

    NSDictionary *dic = [NSFunction getDocConfig];

    NSDictionary *info = [[NSBundle mainBundle]infoDictionary];

    BOOL exist =[[NSFileManager defaultManager]fileExistsAtPath:path];

    if (exist) {

        if ([[dic valueForKey:@"Version"]isEqualToString:[info valueForKey:@"CFBundleShortVersionString"]]) {

            //如果版本号相同,那么直接进入主界面

           self.window.rootViewController =[storyboard instantiateInitialViewController];

        }

        else{

            //如果版本号不相同,那么代表用户以前安装过此软件,直接进入欢迎界面

           self.window.rootViewController =  [storyboard instantiateViewControllerWithIdentifier:@"HelloViewController"];

        }

    }

    else{

        //如果不存在的话,说明软件是头一次安装,建立plist文件,并且进入欢迎页面

        self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"HelloViewController"];

        NSString * doc = [[NSBundle mainBundle]pathForResource:@"UserConfig" ofType:@"plist"];

        NSDictionary *docdic = [NSDictionary dictionaryWithContentsOfFile:doc];

        [docdic writeToFile:path atomically:YES];

        

        NSString *content = [[NSBundle mainBundle]pathForResource:@"Content" ofType:@"plist"];

        

        NSDictionary *contt = [NSDictionary dictionaryWithContentsOfFile:content];

        [contt writeToFile:[NSFunction getContentPath] atomically:YES];

    }

}

1.首先取到App的document文件夹路径,通过NSFileManager的fileExistAtPath查询该文件夹是否存在UserConfig.plist文件(该plist中存有版本号以及记录之前点击cell的行号)

2.如果版本号相同,那么直接进入主界面.

如果版本号不相同,那么代表用户以前安装过此软件,直接进入欢迎界面.

3.如果不存在的话,说明软件是头一次安装,建立plist文件,并且进入欢迎页面.

在这里需要注意的问题是: [[NSBundle mainBundle]infoDictionary]用这种方法取到的是程序的App文件夹中的系统文件(infoDictionry),里面存着程序名,程序图标,程序的版本号等信息.而App文件夹中的内容是只可读不可写,那就需要我们把版本号取出,与我们在Document中写入的userConfig.plist文件中的版本号进行比较.

 

 

二.编辑欢迎页面

由于这个程序只是用来练习的小程序,所以欢迎页面做的很简单,只有几个label和一个进入程序的按钮.将按钮关联到代码中.

只要进入了欢迎页面中,就代表着当前程序的版本号与之前不同.所以要将infoDictionary中的版本号写入到document中的userConfig.plist文件中.

代码如下:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    [self presentViewController:[storyboard instantiateViewControllerWithIdentifier:@"MainViewController"] animated:YES completion:^{}];

    NSDictionary *UserConFile =[[NSBundle mainBundle]infoDictionary];

    NSDictionary *dic = [NSFunction getDocConfig];

    [dic setValue:[UserConFile valueForKey:@"CFBundleShortVersionString"] forKey:_K_VERSION];

    [dic writeToFile:[NSFunction getDocConfigPath] atomically:YES];

注:在storyboard中初始化页面与xib不同

 

三.编写主界面

用storyboard将装饰控件创建完毕. 然后最重要的就是这个tableview了.

在storyboard中拖入一个storyboard,将tableview关联到代码中.同时需要将tableview的代理设置为该view.(这里可以在storyboard 中右键tableview拖入view选择delegate或者在代码中添加tableview.delegate = self;)

在.h文件中声明<UITableViewDelegate>

连接代理后,xcode会出现warn.我们需要在代码中重写它的两个方法:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

我写的是20行cell的tableview,所以直接在该函数中写入return 20;

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

这个代理函数的作用就是在创建cell的时候,我们想对cell添加什么内容或者创建cell.代码如下:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"normalcell" ];

    if (cell ==nil) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"normalcell"];

    }

    [cell setBackgroundColor:[UIColor clearColor]];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    NSDictionary *contentConfig =[NSFunction getContent];

    NSString *keyName = [NSString stringWithFormat:@"%ld",(long)indexPath.row];

    NSString *past = [contentConfig objectForKey:keyName];

    cell.textLabel.text =past;

    if ([AppDelegate shareDelegate].number == indexPath.row) {

        cell.textLabel.textColor = [UIColor whiteColor];

        _currentcell = cell;

    }

    else

    {

        cell.textLabel.textColor = [UIColor blackColor];

    }

 

    return  cell;

注:这里使用的创建cell方法是地址池复用cell(不知道术语,所以暂时这么说了...就是每一次进入的时候查看是否存在空闲而且标识为normalcell的,如果存在就可以直接使用,而如果不存在,就新创建一个标识为normalcell的cell)

[AppDelegate shareDelegate].number是在AppDelegate.h中声明的全局变量,用来分辨当前是第几行的cell,当然也可以不用全局变量.因为全局变量应该会影响程序的运行速度

 

 

待续