分别搜了网络上关于动态按钮的一些博客,但不适合一个动态数据集合向界面绑定动态按钮的需求。应客户傻瓜似需求,将所有数据用按钮排列到界面上,所以对动态按钮进行了学习。
我的动态数据集合是通过Socket向服务端获取到的。用到的Socket,有好几个开源的代码可用,我看过的是GCDAsyncSocket,还有一些,我用的是google公司开源出来的一个,有个缺点是不能主动接收服务端发过来的数据,也就是说IOS客户端接收服务端的数据需要
[sock readDataWithTimeout:-1 tag:0];
手动控制,并且要给出接收的Tag值,接收的方法中用Tag去判断在什么地方写的接收。如果服务端主动发个数据,而没有上述接收代码,那客户端将接收不到。这个套接字问题因为项目时间问题没有去研究,心想着google的AsyncSocket文件几千行代码,研究去开个线程接收数据需要时间,这里是个于技术不严谨的地方。但凡在公司里做产品和个人的研究技术,还是有抵触的地方吧。
接收数据并把数据放
@property NSMutableArray* _schemaList; 集合里,并且绑定集合中的数据代码如下:
-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSString* aStr = [[NSString alloc] initWithData:data encoding:0x80000632];//0x80000632 国标编码
NSArray *arrReturn = [aStr componentsSeparatedByString:NSLocalizedString(@",", nil)];
if (tag==0)//模式执行返回信息
{
NSString * ressssss=[arrReturn objectAtIndex:1];
if([ ressssss isEqual:@"ERR"])
{
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"模式执行失败"delegate:self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
[alert show];
return;
}
}
else if (tag == GETWALL) {
}
else if (tag == GETWALLROWCOL)//获取模式
{
NSMutableArray* modeArray = [[NSMutableArray alloc]init];
for (int i=3; i<[arrReturn count]; i+=2) {
SingalMode* mode = [[SingalMode alloc] init];
mode.schemaName = [arrReturn objectAtIndex:i];
mode.openStyle= [arrReturn objectAtIndex:i+1];
[modeArray addObject:mode];
}
self._schemaList=modeArray;//将Socket传过来的值给模式窗口类的全局变量
//绘制按钮到界面
for(int j=0;j<[self._schemaList count];j++)
{
SingalMode *mode=[self._schemaList objectAtIndex:j];
CGRect frame = CGRectMake(30+j%5*130, 80+j/5*130, 100, 100);
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = frame;
[button setTitle:mode.schemaName forState: UIControlStateNormal];
//button.backgroundColor = [UIColor greenColor];
button.tag = 2000;
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
}
else if (tag == GETSOURCEGROUP)
{
}
else
{
[sock readDataWithTimeout:-1 tag:0];
}
}
-(IBAction) buttonClicked:(id)sender {
UIButton *btn =(UIButton *)sender;
NSString *btnTitle =[btn currentTitle];//获取到btn 的title
AsyncSocket* skt=[shareObject GetClientSocket]; //访问全局shareObject变量socket
NSString* strGetSourceCode =[[NSString alloc] initWithFormat:@"<OpenSchema,%@>",btnTitle];
NSData* date = [strGetSourceCode dataUsingEncoding:0x80000632];//向服务端发送执行模式的命令
[skt writeData:date withTimeout:-1 tag:0];
[skt readDataWithTimeout:1000 tag:0];
}
这里绑定的按钮都注册了buttonClick事件,单击按钮通过sender转化为btn获取按钮的内容并向服务端发送数据。socket的访问是通过共享数据类shareObject实现的,关于IOS中各*.m的类文件访问共享数据的问题也是个学习的地方,在此不叙述。