【图片浏览器2 plist文件介绍 Objective-C语言】

一、解决上一篇文章中,图片浏览器点“上一张”按钮,到第一张时,“左”和“右”两个按钮都不能点了的问题,

1.为什么会出现这个BuG

因为你点“上一张”的时候,你只判断了“上一张”按钮,是否应该让它可用,

你是不是忘记让“下一张”按钮,也应该让它变成可用一下啊,

因为当你点到最后一张图片的时候,“下一张”按钮,变的不可用了,

当你点“上一张”按钮的时候,你应该让“下一张”按钮变的可用才对,

其实,简单的解决办法就是,把上面这句话拷到下面,

就是把这句话:

self.btnNext.enabled = (self.index != (self.pic.count -1));

拷贝到

- (IBAction)pre{

self.btnPre.enabled = (self.index != 0);

//拷贝到这里…

self.btnNext.enabled = (self.index!= (self.pic.count-1));

}

“上一张”按钮,是不是要对两个按钮都做一个判断吧,

然后呢,当点“下一张”的时候,是不是也要对两个按钮都做一个判断吧,

在- (IBAction)next;方法里,

也拷贝上这句话,

self.btnPre.enabled = (self.index != 0);

也就是这样:

- (IBAction)next{

self.btnNext.enabled = (self.index != (self.pic.count -1 ));

self.btnPre.enabled = (self.index != 0);

}

当点“下一张”的时候,是不是也要对两个按钮都做判断吧,

这样的话,就可以实现,那两个按钮,点到最后一张的时候,再点“上一张”,“下一张”按钮是不是也变的可用了,

点到第0张的时候,再点“下一张”,是不是“上一张”按钮也变的可用了,

也就是说,你无论是点“下一张”,还是点“上一张”,

都需要同时判断“左”“右”两个按钮是否可用,

二、优化这些代码,

1.你看到这些代码,你觉得爽吗,不爽,为什么不爽,

因为,只有这句话是不同的,其他的代码都是相同的,

//1.让索引++

self.index++;

//1.让索引–

self.index–;

其他的代码都是相同的吧,

//2.根据索引获取数据,

//3.设置控件值,

//4.设置两个按钮是否可用,

是不是后面这些代码都是一样的,

所以说这个代码你看起来爽吗,

所以说,接下来,我们就把它改进一下,

2.把xcode文件夹下,这个代码拷贝一份,做个备份,接下来,我们来封装这个代码,

3.既然“上一张”“下一张”,后面的代码都是一样的,

我就想,能不能把后面代码提取到一个方法里面吧,

提取到一个方法里面,

怎么提取呢,

大家思考一下,后面这些代码,无非就是根据数据设置控件值的一段代码啊,

那么我们就可以给它起一个名称,就是“设置控件的值”嘛,对吧

就是setData可以吧,

- (void)setData;

把中间这段代码给它拷贝过来,

- (void)setData{

//2.从数组中获取当前这张图片的数据

NSDictionary *dict = self.pic[self.index];

//3.把获取到的数据设置给界面上的控件

self.lblIndex.text = [NSString stringWithFormat:@“%d/%ld”,self.index+1,self.pic.count];

//通过image属性来设置图片框里面的图片,

self.imgViewIcon.image = [UIImage imageNamed:dict[@“icon”]];

//设置这张图片的标题

self.lblTitle.text = dict[@“title”];

self.btnPre.enabled = (self.index != 0);

self.btnNext.enabled = (self.index != (self.pic.count - 1));

}

好,这样的话,就是,第一步,根据索引取到当前第几条数据,

第二步,根据数据,设置控件的值,

第三步,控制“上一张”与“下一张”按钮,是否可用,

这样的话,我们是不是这一个方法,就实现了这个功能啊

3.好,接下来,“上一张”,非常简单,

先让index减减,–

然后呢,再调它的什么,setData,

[self setData];

- (IBAction)pre{

//1.让索引–

self.index–;

[self setData];

}

是不是就OK了,

然后呢,“下一张”代码,也很简单,

怎么办,

先控制索引加加,++

然后再调用setData,

- (IBAction)next{

//1.让索引++

self.index++;

//2.设置控件数据

[self setData];

}

也就是说,“下一张”就先让索引加加,然后再设置数据,

4.我们这么改过以后,

其实是不是,效果还是和刚才一样的啊,

二、好,接下来,就是解决,一开始的时候,第一张就没有显示的问题,

1.怎么来解决第一张呢,

第一张,是需要你点按钮的时候,才显示吗,

不是,

当我们这个界面一加载完毕,控制器一创建完毕,控制器所管理的那个View一加载完毕,

立刻就应该显示第一张吧,

那么这个时候,怎么办呢,

其实就是让它执行一下“下一张”,就OK了,

但是,大家看,这个是我们的控制器所管理的View加载完毕之后,执行的这个方法,

//控制器的View加载完毕以后执行的方法:

- (void)viewDidLoad{

[super viewDidLoad];

//我首先让self.index = -1

self.index = -1;

//可不可以,我就想让它等于-1,为什么呢,

//大家思考一下,我先让它等于-1,

//然后我手动调用一下它的next方法,

[self next];

//这个方法是什么呢,是不是“下一张”图片的方法,

//可不可以,当这个控制器的View一加载完毕以后,因为默认,我们控制器有一个属性,是index,它是整形的,这个整形属性,默认不赋值,是0,对吧,但是我为了让第一张显示呢,我当这个View加载完毕以后,我手动让这个索引变成-1,然后再调next方法,相当于是不是手动点了一下next啊,点next以后,是不是索引就要加一下,由-1加1变成几了,0 吧,

0完了再调setData,是不是把第0张取出来了吧,

这样是不是第一张就有了吧,

运行一下试试,功能都实现了吧

二、plist文件介绍

1.怎么向plist文件里加一个元素,

比如说,我pic.plist里面只有4个元素,我想给里面加一个“chiniupai”这个图片,

点item3中间的加号,管用吗,

不管用,

是不是得点Root那一行,Array左边的加号,才管用啊,

注意,得把这个Array展开,展开之后,再点Root那一行的加号,才能在里面加1个吧,

item3中间的加号点一下,是不是相当于在这个字典里加一个键值对吧,

这个新加入的item0里面,每1个是什么,是不是一个字典,

所以类型选择Dictionary,

这个时候,再点item0中间的加号,这个时候,会再创建一个字典,

哦,是再创建一个数组里面的元素,

你如果想向这个item0的字典里面,创建一个键,这时候应该怎么操作,

把item0左边的箭头,是不是点成向下,

然后,再点item0中间的加号,

才表示向这个item0项目增加呢,

如果item0左边的箭头,是横的,你点它中间的加号,会给它增加一个兄弟,

得点到item0左边的箭头,点一下,向下以后,再增加,才会给它增加子元素呢,

才是它下面的内容,

2.另外,刚才在viewDidLoad方法里面,因为默认index = 0,所以这个时候,你直接调一下setData方法,也是可以的,

- (void)viewDidLoad{

[super viewDidLoad];

[self setData];

}

二、紧接着,我就把plist文件,是怎么来处理的,给大家说一下,

1.怎么去根据我们要的东西,来创建这个plist文件,

为了让大家容易理解,我先写点儿代码,然后把代码再转成plist文件

2.例如,我这儿有这么一段代码:

第一个字典,怎么快速创建一个字典,还记得吗,爱特符号@,大括号吧,

NSDictionary *dict1 = @{};

比如说,来个键值对,来个键值对,

我们说,每一个人都有姓名、性别、年龄、是不是有一堆的信息啊,

我们假设,我要用1个字典,来描述1个人的信息,

那么这个字典中,首先,是不是要有姓名啊,

NSDictionary *dict1 = @{@“name”😡“张三”,@“age”:18};

注意,这么写,对不对,@“age”:18,年龄,十八

18不对,为什么,基本数据类型,不能放到我们的字典集合里面吧,

要想把它放进去,怎么办,爱特18,@18,

可不可以这么写,可以,

NSDictionary *dict1 = @{@“name”😡“张三”,@“age”:@18};

你用双引号把18引起来,是不是也行啊,@“18”,

这样的话,就把18是不是作为字符串来表示了,

如果我18不希望作为字符串来表示呢,

是不是用一个爱特@,把它作为OC对象来写啊,

有了姓名、年龄,再来个什么,@"height"吧,

NSDictionary *dict1 = @{@“name”😡“张三”,@“age”:@18,@“height”:@180};

@18,@180,这个知道什么意思吧,

这个是把基本的数据类型,封装成了一个什么类型,

是不是NSNumber,这个OC对象类型吧,

这是把基本数据类型封装成OC对象的一个快速写法,

好,这是有一个这么一个字典了,

一个字典,表示一个人,我再来两个人、三个人:

NSDictionary *dict1 = @{@“name”😡“张三”,@“age”:@18,@“height”:@180};

NSDictionary *dict2 = @{@“name”😡“李四”,@“age”:@19,@“height”:@190};

NSDictionary *dict3 = @{@“name”😡“王五”,@“age”:@17,@“height”:@178};

这样是不是有3个人啊,三个字典,

然后我把这3个字典,放到一个数组里面,

NSArray *students = @[];

这是不是普通的一个不可变数组吧,

然后,我可以把dict1、dict2、dict3,把这3个字典,放到1个数组里面,

NSArray *students = @[dict1,dict2,dict3];

这样的话,我是不是用1个数组,来描述了这3个人的信息了,

然后呢,我愿意输出一下,怎么写呢,

NSLog(@“%@”,students);

输出: ( {

age = 18;

height = 180;

name = “\U5f20\U4e09”;

},

{

age = 19;

height = 190;

name = “\U674e\U56db”;

},

{

age = 17;

height = 178;

name = “\U738b\U4e94”;

}

)

打印出来的结果,是不是就是我们1个数组里面,有3个字典啊,

好,接下来,我就希望用一个plist文件,来保存这3个人的信息,

因为你现在是不是只在内存里面的啊,

当程序运行完,这些数据是不是就都销毁了,

我希望把这些数据永久的保存到一个plist文件里面,怎么写,

好,这个时候要手动建立一个plist文件,

我就演示一下怎么去手动的建立一个plist文件,

我想建立一个能存储这样一个信息的plist文件,

NSDictionary *dict1 = @{@“name”😡“张三”,@“age”:@18,@“height”:@180};

NSDictionary *dict2 = @{@“name”😡“李四”,@“age”:@19,@“height”:@190};

NSDictionary *dict3 = @{@“name”😡“王五”,@“age”:@17,@“height”:@178};

NSArray *students = @[dict1,dict2,dict3];

比如说,在Supporting Files下面,右键,New File,新建一个File,

注意,因为它是个资源文件,所以要选择Resource,

Resource是资源文件,

哪个是我们的plist文件呢,

注意,这个p,指的就是属性列表,Property,Property List,

plist文件,根本上是个什么东西,是一个xml文件,

选择Property List,点击Next,

比如说,Save As来个People.plist,

还是来个Students.plist吧,

点击Create,

3.好,接下来,我要在这个plist文件中,

我们是不是已经新建好一个plist文件了,

然后,我们仔细观察一下代码,

NSDictionary *dict1 = @{@“name”😡“张三”,@“age”:@18,@“height”:@180};

NSDictionary *dict2 = @{@“name”😡“李四”,@“age”:@19,@“height”:@190};

NSDictionary *dict3 = @{@“name”😡“王五”,@“age”:@17,@“height”:@178};

NSArray *students = @[dict1,dict2,dict3];

我将来是要把这个学生,把students存进去,

那么它,整体是个什么,NSArray吧,

所以说,这个plist文件,第一行Root的类型,应该改成什么,Array吧,

然后,接下来,我们说,这个Array里面,存的就是一个一个字典吧,

NSArray *students = @[dict1,dict2,dict3];

所以说,我首先要让这个plist文件里面,增加内容吧,

先把Root左边的箭头,点的向下,

点的向下以后,点这一行中间的加号,

点这个加号,表示向这个Array中,增加一个子元素,

但是这个子元素,是字典类型吗,不是,

怎么把这一行变成字典类型,

点一下这个String,把它改成Dictionary,

然后这就表示一个字典了吧,

我们看,这个数组中,第一个字典保存的是什么,

是不是@“name”、@“age”、@“height”,这三个键值对吧,

所以说,打开这个plist文件,这个字典中,把这个item 0左边的小三角,点的向下,

点的向下以后,再点中间的加号,在里面增加3个键值对,

第一个叫@“name”,填写name,

里面存的是什么,@“张三”,填写张三,

第二个里面存的是什么,age,里面存的是什么,18,

中间的类型,选择String,

第三个键叫什么,height,里面存的是什么,180,中间的类型,选择String,

是不是厘米啊,

这样的话,我们是不是有3个值了,

但是你观察,因为后两个,是不是都是数字类型啊,

年龄和身高都是数字类型,

所以说,你这儿也可以对应地把它的类型改一下,

比如说,age改成一个Number类型,

height,改成一个Number类型,

这样的话,是不是就是用一个字典,表示我们一个人的信息了,

但是我们说,我有3个人,所以说,我们要把这个item 0 左边的箭头,先点成横着的,

然后要把这个字典选中它,

command + C,command + V,再V,

这样的话,我们后面又有两个字典了,

第二个字典中的键,叫什么,李四吧,

年龄呢,19,身高呢,190,

然后,接下来,第三个字典这儿,是不是再改一下,就ok了,

这样的话,我们这个数组里面,是不是就有3个键值对的字典了,

所以说,这个plist文件,就是这么来的,

你根据实际需求,你需要保存一个什么样的数据,你就去建这个plist文件,就ok了,

这就是plist文件的来源,就这么去建,

好了,这是我们创建plist文件,

四、好,接下来再说一下,这个plist文件,到底是个什么东西,

选择最上面的工程蓝色图标,右键,选择Open in Finder,

打开这个plist文件,发现,plist文件,本质上就是一个xml文件,

我们右键点击Students.plist文件,选择打开方式,选择用记事本打开,就是TextWrangler.app,

这就叫xml文件,



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
 <dict>
		<key>name</key>
		<string>张三</string>
		<key>age</key>
		<integer>18</integer>
		<key>height</key>
		<integer>180</integer>
	</dict>
	<dict>
		<key>name</key>
		<string>李四</string>
		<key>age</key>
		<integer>19</integer>
		<key>height</key>
		<integer>190</integer>
	</dict>
	<dict>
		<key>name</key>
		<string>王五</string>
		<key>age</key>
		<integer>17</integer>
		<key>height</key>
		<integer>178</integer>
	</dict>
 </array>
 </plist>

xml文件,是一个可扩展,x表示extensible,

可扩展,

m表示mark,标记,

l表示language,

Extensible Mark Language,

可扩展标记语言,

我先解释一下,什么叫标记语言,

什么是标记语言,

标记语言有很多,比如说xml是标记语言,html也是标记语言,

什么叫做标记语言呢,大家都读过书吗,

读书的时候,都做过笔记吗,

至少你见过别人做过笔记吧,

你读书的时候,比如说,这句话,有个特殊的理解,

是不是要在旁边做个标记,

或者你觉得这句话不理解,是不是也要在旁边做个标记吧,

你读书的时候,书里面原来的内容,就是书本上原来的那些文章,

但是你自己对它的理解,

或者说,你自己对它特殊的一些认识,

是不是可以在旁边写个笔记,

你写的这个笔记,是不是就是标记,

这个就可以看做标记,

标记,并不是内容本身,

这个标记,仅仅是为了让你更容易的理解那个内容,而产生的,

比如说,读书的时候,用彩色笔,画的一堆一堆的标记,

比如说,那句话,是那本书上的原文,但是老师说,这个是重点,然后你就用彩色笔画一下,或者下面画一根线,

那个就是标记,

那个标记,它并不是书本的内容本身,

只是为了让你以后,一看到这页,这么多彩色笔勾的,一看这页就是重点,

这页考试要考的,抄的时候你就翻到这页抄就得了,

那么这个时候,你画的这些线,这些就是标记,

标记并不是内容本身,标记仅仅是为内容增加额外的信息而已,

让你一看到这个标记,就知道这是老师说的重点,我得把它背会,

这就是标记的作用,

在我们这篇文档当中,

什么才是真正的内容啊,

张三、18、180、李四、19、190、王五、17、178

这些才是真正的数据了吧,

那么,旁边这些< key>、< string>、< integer>、< dict>

这些就是标记,

如果说,没有这些标记的话,

你怎么知道这个18表示年龄呢,

有了标记以后,你一看,哦,这个18是表示年龄,

age它对应的18,

18是一个什么数据类型呢,是个integer,

是个整型,

那么这个name对应的是张三,

表示张三这个汉字呢,它是人名,

它是string,字符串类型,

如果你把name,改成一个sex,

这个人的性别叫张三,

那么这个张三就变成性别了,

就是说,本身内容摆在这儿,内容,它就在那儿放着,

你要想让它有特殊的含义,

请用一些特殊的标记,给它就是,围绕起来,

或者用一些特殊的标记,来表示,

这样的话,这个内容就有了一些特殊的含义了,

当我们通过程序,读取这个文档的时候,

就会根据特殊的标记,

把这些内容转换成对应的,我们的数组,或者是字典,等等,

这就是标记语言,

这个xml,这就是一个可扩展标记语言,

其实,我们的plist文件,它就是一个xml文件,为什么它的后缀,不叫做xml呢,

因为,当它的后缀是一个plist文件的时候,你双击它的时候,会自动使用xcode打开,

会打开一个这样的格式,

但是,如果你要把它的后缀改成xml,

拷贝一个副本吧,command + C , command + V

把后缀改成xml,

再双击的时候,是不是就不是用xcode打开了,

拿这个工具给你打开了,

是不是就不是我们plist那个样子了吧,

好了,这是关于我们plist文件如何来创建,给大家说了这么一个思路

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值