零ios基础自学苹果开发及项目实战QQ聊天App(三)

Home / Article MrLee 2014-11-27 2671

上次写第到第二课的时候看到有系统更新,所以直接把Mac Os升级到10.9.5,然后把xcode也升级到了6.1版本,结果意不想到的悲情了。我把原来的xcode5直接删除了,然后用这个xcode6.1.dmg文件进行安装,装了几次总是没有模拟器,我那个郁闷啊,然后重复几次每次都是失败告终!于是果断休息一下,去吃饭,休息了2天写写VC++程序去了,再次回来已经有几好天了,准备再解决这个总是,谁知道打开机器进入系统之后,打开xcode神奇般的出现了模拟器,我只想说,你妹,要这么坑我么!
前面说了一些就再说一句,这个教程大家一定要动手去做,如果卡住了请加入我们QQ群一起探讨!QQ群在首页的公告上面有。
继续上次进度往下讲。上节界面事件都写好了,就只差网络通信了,那么这次登录我们采用的是HTTP协议,这个相信有编程基础的朋友不陌生。网络编程就会涉及到同步和异步的问题,这里面我就不详细讲了,IOS栏目有专门文章讲解《ios开发block进行网络请求回调简单封装》。代码也封装好了注释也相对清楚。这里还用到了block技术及使用id类型,这个IOS技术也有相关的文章介绍,大家可以搜索。这里面我贴出登录部分的源码
-(void)loginEvent
{
    self.dialog = [[UIProcessDialog alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:self.dialog];
    
    NSString *api = @"http://www.it72.com/api.php";
    NSString *sData = [NSString stringWithFormat:@"username=%@&password=%@",self.nameText.text,self.pwdText.text];
    BOOL isSyn = NO;
    if (isSyn) {
        //同步
        NSString *dataString = [HttpUtil httpAsynchronousRequestUrl:api postStr:sData];
         NSLog(@"synResult:%@",dataString);
        //从父窗口中移除
        [self.dialog removeFromSuperview];
    } else {
        //异步
        [HttpUtil httpNsynchronousRequestUrl:api postStr:sData finshedBlock:^(NSString *dataString, NSMutableData *retData) {
            //从父窗口中移除
            [self.dialog removeFromSuperview];
            if(dataString == nil)
            {
                [UIAlertUtil showInfoAlert:@"网络出错"];
                return;
            }
            NSLog(@"nsynResult:%@",dataString);
            NSError *error = nil;
            id jsonObj = [NSJSONSerialization JSONObjectWithData:retData options:NSJSONReadingMutableContainers error:&error];
            if (jsonObj == nil || error != nil) {
                [UIAlertUtil showInfoAlert:@"数据格式错误"];
                return;
            }
            NSMutableArray *array = [jsonObj objectForKey:@"result"];
            NSNumber *code = [array valueForKey:@"code"];
            NSString *msg = [array valueForKey:@"msg"];
            if ([code intValue] == 1) {
                [UIAlertUtil showInfoAlert:@"登录成功"];
            }else{
                [UIAlertUtil showInfoAlert:msg clickBlock:^(NSInteger index) {
                    NSLog(@"点击了%ld",index);
                }];
            }
        }];
    }
}

简单的封装了一下UIAlertView的使用。这里也贴出代码 UIAlertUtil.h
//
//  UIAlertUtil.h
//  XQQ
//
//  Created by leehom on 14-11-27.
//  Copyright (c) 2014年 leehom. All rights reserved.
//
#import 
typedef void (^ClickBlock)(NSInteger index);
//封装一个对话框
@interface UIAlertUtil : NSObject
+(void)showInfoAlert:(NSString*)message;
+(void)showInfoAlert:(NSString*)message clickBlock:(ClickBlock)block;
+(void)showInfoAlert:(NSString*)message delegate:(id)delegate clickBlock:(ClickBlock)block;
+(void)showInfoAlert:(NSString*)title message:(NSString*)message delegate:(id)delegate clickBlock:(ClickBlock)block;

@property (strong,nonatomic) ClickBlock block;
@property (strong,nonatomic) UIAlertView *alert;
@end

UIAlertUtil.m源码
//
//  UIAlertUtil.m
//  XQQ
//
//  Created by leehom on 14-11-27.
//  Copyright (c) 2014年 leehom. All rights reserved.
//
#import "UIAlertUtil.h"
static UIAlertUtil *util = nil;
@implementation UIAlertUtil
+(void)showInfoAlert:(NSString*)message
{
    [self showInfoAlert:message clickBlock:nil];
}
+(void) showInfoAlert:(NSString *)message clickBlock:(ClickBlock)block
{
    [self showInfoAlert:message delegate:nil clickBlock:block];
}
+(void) showInfoAlert:(NSString *)message delegate:(id)delegate clickBlock:(ClickBlock)block
{
    [self showInfoAlert:@"提示" message:message delegate:delegate clickBlock:block];
}
+(void) showInfoAlert:(NSString *)title message:(NSString *)message delegate:(id)delegate clickBlock:(ClickBlock)block
{
    if (util == nil) {
        util = [[UIAlertUtil alloc]init];
    }
    util.block = block;
    util.alert = [[UIAlertView alloc]init];
    [util.alert setTitle:title];
    [util.alert setMessage:message];
    if(delegate == nil)
        [util.alert setDelegate:util];//窗口在显示的时候已经被ARC释放,所以要创建一个全局的
    else
        [util.alert setDelegate:delegate];
    [util.alert addButtonWithTitle:@"确定"];
    [util.alert show];
}
//点击按钮的时候被调用
-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (self.block != nil) {
        self.block(buttonIndex);
    }
}
//窗口被关闭的时候调用
-(void) alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    util.block = nil;
    [util.alert setTitle:@""];
    [util.alert setMessage:@""];
}
@end

UIAlertUtil.m需要讲一点,静态的UIAlertUtil变量,为什么要设置静态的呢?窗口在显示的时候,这个UIAlertUtil对象就被ARC给释放了,所以自然也就不会有clickedButtonAtIndex事件响应。所以我写成了静态的变量。这样的缺点大家想想,是什么?如果同时调用多次,那么它只会显示最后一次的title和message内容,呵呵……
好的,每天学一点。今天大家学会两点就可以了,一是HTTP编程再就是block的使用,事件代理也需要掌握,前面也用到了一些。那么本次就先到这里,下一节继续学习ios的控件,如类似安卓的Tab、ListView之类的。

本文链接:https://www.it72.com/341.htm

推荐阅读
最新回复 (0)
返回