IOS 动态按钮 Socket

分别搜了网络上关于动态按钮的一些博客,但不适合一个动态数据集合向界面绑定动态按钮的需求。应客户傻瓜似需求,将所有数据用按钮排列到界面上,所以对动态按钮进行了学习。

我的动态数据集合是通过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的类文件访问共享数据的问题也是个学习的地方,在此不叙述。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值