初学者干货:
问题抽象:
现在在做一个音乐播放的模块,对于音乐播放顺序有三种状态切换,如下图所示,
现在我只抽象出最简单的部分,以该Button操作的交互过程来描述,
(1)Button默认的状态是“顺序播放”歌曲模式
(2)不断点击Button,歌曲循环模式切换顺序为“顺序播放->单曲循环->随机播放->顺序播放->....”
(3)每次点击设置了一种歌曲循环模式,都将该循环模式发送给服务器,下次来到该界面的时候,从服务器读取数据,自动载入正确的模式,而不一定就是“顺序播放”循环模式
相信这个简单的场景,大家都非常明白。
解决方案
-----------------分割线----------------我自己的解决方案----------------如下---------------------------
我认为
(1)Button一共就三种状态,所以定义了一个enum枚举,代表了3中歌曲播放循环模式,
1
2
3
4
5
|
enum {
SoundPlayQueue, //顺序播放
SoundPlaySingle, //单曲循环
SoundPlayRandom, //随机播放 };
|
(2)使用Button的tag属性作为标识歌曲播放的状态,statusFromServer作为从服务端读取到的设置的歌曲播放状态(它有三个值,分别是00-顺序播放,01-单曲循环,02-随机播放),那么初次加入界面时候,就要对Button的tag进行赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
- ( void )viewDidLoad
{
[super viewDidLoad];
int
statusFromServer = [从服务端获取的歌曲循环模式-有三个值(00,01,02)];
if (statusFromServer == 00)
{
playBtn.tag = SoundPlayQueue;
[playBtn setImage:顺序播放图片];
}
else
if (statusFromServer == 01)
{
playBtn.tag = SoundPlaySingle;
[playBtn setImage:单曲循环图片];
}
else
if (statusFromServer == 02)
{
playBtn.tag = SoundPlayRandom;
[playBtn setImage:随机播放图片];
}
}
|
(3)点击Button,添加Button点击方法-playBtnClicked,切换歌曲循环模式,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
- ( void )playBtnClicked:(id)sender
{
UIButton tempBtn = (UIButton *)sender;
if (tempBtn.tag == SoundPlayQueue)
{
//如果现在顺序播放,那么下一个模式设置为单曲循环,
tempBtn.tag = SoundPlaySingle;
[tempBtn setImage:单曲循环图片];
statusFromServer = 01;
}
else
if (tempBtn.tag == SoundPlaySingle)
{
//如果现在单曲循环,那么下一个模式设置为随机播放,
tempBtn.tag = SoundPlayRandom;
[tempBtn setImage:随机播放图片];
statusFromServer = 02;
}
else
if (tempBtn.tag == SoundPlayRandom)
{
//如果现在随机播放,那么下一个模式设置为顺序播放,
tempBtn.tag = SoundPlayQueue;
[tempBtn setImage:顺序播放图片];
statusFromServer = 00;
}
}
|
总结:
我用这种方式确实解决了问题,但是总感觉代码过于累赘和不合理,
(1)最主要的一个问题就是Button作为一个UI控件,它只是用于进行界面显示和事件控制,但是我这边却用它的属性来标识当前的歌曲循环模式,也就是说Button的所做的事情超过了它的业务范畴;
(2)其次就是这种方式,无疑增加了当前ViewController中的代码,是的ViewController看起来杂乱
拓展思路:
playBtn.tag = statusFromServer;
[playBtn setImage:[UIImage image@"playImg%d", statusFromServer]];//随机播放图片 对应playImg02.png图片
- (void)playBtnClicked:(id)sender
{
UIButton tempBtn = (UIButton *)sender;
[playBtn setImage:[UIImage image@"playImg%d", (tempBtn.tag+1)%3]];//(tempBtn.tag+1)%3 为下一个状态的图片
}