IOS第四天(5:创建备份区按钮和判断结果)

创建备份区按钮和判断结果

/** 创建备选区按钮 */
- (void)createOptionButtons:(HMQuestion *)question
{
    // 问题:每次调用下一题方法时,都会重新创建21个按钮
    // 解决:如果按钮已经存在,并且是21个,只需要更改按钮标题即可
    if (self.optionsView.subviews.count != question.options.count) {
        // 重新创建所有按钮
        for (UIView *view in self.optionsView.subviews) {
            [view removeFromSuperview];
        }

        CGFloat optionW = self.optionsView.bounds.size.width;
        CGFloat optionX = (optionW - kTotolCol * kButtonWidth - (kTotolCol - 1) * kButtonMargin) * 0.5;

        for (int i = 0; i < question.options.count; i++) {
            int row = i / kTotolCol;
            int col = i % kTotolCol;

            CGFloat x = optionX + col * (kButtonMargin + kButtonWidth);
            CGFloat y = row * (kButtonMargin + kButtonHeight);

            UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(x, y, kButtonWidth, kButtonHeight)];
            [btn setBackgroundImage:[UIImage imageNamed:@"btn_option"] forState:UIControlStateNormal];
            [btn setBackgroundImage:[UIImage imageNamed:@"btn_option_highlighted"] forState:UIControlStateHighlighted];

            [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

            [self.optionsView addSubview:btn];

            // 添加按钮监听方法
            [btn addTarget:self action:@selector(optionClick:) forControlEvents:UIControlEventTouchUpInside];
        }
        NSLog(@"创建候选按钮");
    }

    // 如果按钮已经存在,在点击下一题的时候,只需要设置标题即可
    int i = 0;
    for (UIButton *btn in self.optionsView.subviews) {
        // 设置备选答案
        [btn setTitle:question.options[i++] forState:UIControlStateNormal];

        // 回复所有按钮的隐藏状态
        btn.hidden = NO;

//        // 添加按钮监听方法
        // 提示,如果再次添加监听方法,意味着每次调用下一题的时候都会添加监听方法
//        [btn addTarget:self action:@selector(optionClick:) forControlEvents:UIControlEventTouchUpInside];
    }
}

#pragma mark - 候选按钮点击方法
/** 候选按钮点击 */
- (void)optionClick:(UIButton *)button
{
    // 1. 在答案区找到第一个文字为空的按钮
    UIButton *btn = [self firstAnswerButton];

    // 如果没有找到按钮,直接返回
    if (btn == nil) return;

    // 2. 将button的标题设置给答案区的按钮
    [btn setTitle:button.currentTitle forState:UIControlStateNormal];

    // 3. 将button隐藏
    button.hidden = YES;

    // 4. 判断结果
    [self judge];
}

/** 判断结果 */
- (void)judge
{
    // 如果四个按钮都有文字,才需要判断结果
    // 遍历所有答题区的按钮
    BOOL isFull = YES;
    NSMutableString *strM = [NSMutableString string];

    for (UIButton *btn in self.answerView.subviews) {
        if (btn.currentTitle.length == 0) {
            // 只要有一个按钮没有字
            isFull = NO;
            break;
        } else {
            // 有字,拼接临时字符串
            [strM appendString:btn.currentTitle];
        }
    }

    if (isFull) {
        NSLog(@"都有字");
        // 判断是否和答案一致
        // 根据self.index获得当前的question
        HMQuestion *question = self.questions[self.index];

        // 如果一致,进入下一题
        if ([strM isEqualToString:question.answer]) {
            NSLog(@"答对了");
            [self setAnswerButtonsColor:[UIColor blueColor]];

            // 等待0.5秒,进入下一题
            [self performSelector:@selector(nextQuestion) withObject:nil afterDelay:0.5];
        } else {
            // 如果不一致,修改按钮文字颜色,提示用户
            NSLog(@"答错了");
            [self setAnswerButtonsColor:[UIColor redColor]];
        }
    }
}

/** 修改答题区按钮的颜色 */
- (void)setAnswerButtonsColor:(UIColor *)color
{
    for (UIButton *btn in self.answerView.subviews) {
        [btn setTitleColor:color forState:UIControlStateNormal];
    }
}

// 在答案区找到第一个文字为空的按钮
- (UIButton *)firstAnswerButton
{
    // 取按钮的标题
    // 遍历答题区所有按钮
    for (UIButton *btn in self.answerView.subviews) {
        if (btn.currentTitle.length == 0) {
            return btn;
        }
    }
    return nil;
}
时间: 2024-08-03 19:33:16

IOS第四天(5:创建备份区按钮和判断结果)的相关文章

IOS第四天(6:答题区按钮点击和乱序)

#pragma mark - 答题区按钮点击方法 - (void)answerClick:(UIButton *)button { // 1. 如果按钮没有字,直接返回 if (button.currentTitle.length == 0) return; // 2. 如果有字,清除文字,候选区按钮显示 // 1> 使用button的title去查找候选区中对应的按钮 UIButton *btn = [self optionButtonWithTilte:button.currentTitle

CCNA基础(四):路由器的备份升级和交换机的转发过滤

-----------------------------------  Cisco IOS文件系统和设备--------------------- 1.RAM(System):存放路由器正在操作的信息. 2.NVRAM(nvram):放配置文件. 3.Flash(flash):放IOS,相当于硬盘. 4.TFTP Server(tftp):导出配置文件. ----------------------------------------------------------------------

[转]Oracle DB 使用RMAN创建备份2

归档备份:概念 归档备份:概念 如果需要在指定时间内保留联机备份,RMAN 通常会假定用户可能需要在自执行该备份以来到现在之间的任意时间执行时间点恢复.为了满足这一要求,RMAN 会在此时段内保留归档日志.但是,可能仅需要在指定的时间(如两年)内保留特定备份(并使其保持一致和可恢复).用户不打算恢复到自执行该备份以后的某一时间点,只是希望能够正好恢复到执行该备份的确切时间.此外,用户还需要维护保留策略以使备份区井然有序,因此无法使备份恢复到两年前.为了满足保留数据的商业或法律要求,通常需要这么做

IOS的四种数据存储方式及优劣

IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用到的实例对象. 这个对象中储存了系统中用户的配置信息,开发人员能够通过这个实例对象对这些已有的信息进行改动.也能够依照自己的需求创建新的配置项. 他实际上是存储于文件沙盒中的一个.plist文件,而且没有被系统加密,仅仅是ios6以后不是存于经常使用的文档文件夹下,所以不破解系统是看不到该文件的.所

iOS 常用四种数据存储方式

iOS 常用四种数据存储方式 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅, ,使得用户体验更好.下面介绍?一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前?一个方法告诉系统怎么对对象进行编码,而后?一个方法则是告诉系统怎么对对象进行解码.例如对Possession对

iOS开发UI篇—CAlayer(创建图层)

iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控制器view的layer上) 1 // 2 // YYViewController.m 3 // 01-创建一个简单的图层 4 // 5 // Created by apple on 14-6-21. 6 // Copyright (c) 2014年 itcase. All rights reser

IOS的四种数据存储方式和优略

IOS有四种常用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息,它通过一个工厂方法返回默认的.也是最常用到的实例对象.这个对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项.他在IOS6之后已经在文件沙盒中看不到它的信息了,所以可以存储机密信息(用户名和密码)密码,防止手机系统被破解后看你的沙盒子文件.一般这种方法存储少量信息,若是存储大量

iOS学习之sqlite的创建数据库,表,插入查看数据

目录(?)[-] 新建项目sqliteDemo添加使用sqlite的库libsqlite3dylib sqlite 的方法 获取沙盒目录并创建或打开数据库 创建数据表 插入数据 查询数据库并打印数据 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsqlite3.dylib, 新建或打开数据库, 创建数据表, 插入数据, 查询数据并打印 1.新建项目sqliteDemo,添加使用sqlite的库libsqlite3.dylib 2.sqlite 的方法 sqlite3  

iOS的四种传值方式

传值有四种方法 : 1.属性传值 2.单例传值 3.代理传值 4.block传值 一.属性传值   (前-->后) 1. 后面的界面定义一个属性  存放前一个界面传过来的值 注意:属性定义成字符串还是别的类型 取决于你的需求 2. 后面的界面创建完毕后,为属性赋值(记录需要传递的值) 3. 在需要使用值的地方  使用属性记录的值 4. 通过 定义属性 达到传值目的的方法 称为属性传值 属性传值一般用于 从前一个界面向后一个界面传值 二.单例传值  (万能的传值方式  可以跨多个页面之间进行传值)