一、上节课我们已经实现了答对了之后跳到下一题,最后一道题答对之后跳回第一题, 1.但是我们答对以后,我们并没有给这里加分吧 现在我们来实现这个加分功能 2.如果答案正确的话,要在这里加分,然后文字变成蓝色,然后跳转到下一题吧 实现这个之后,我们再点“提示”按钮,是不是提示功能啊:自动显示第一个答案的文字, 3.我们来看看怎么做啊,它要答对加分,那么我们首先是不是要找到答案判断正误的那个地方啊, 我们在哪里判断的正误,是不是option按钮的单击事件啊, option按钮的单击事件,optionButtonClick,这个吧, 找到这个optionButtonClick方法, //待选按钮单击事件 - (void)optionButtonClick:(UIButton *)sender{ //在这个里面判断的正误,在这个里面的哪个地方判断的正误,往下走, //1.隐藏当前被点击的按钮 sender.hidden = YES; //2.把当前被点击的按钮的文字显示到第一个为空的答案按钮上 NSString *text = sender.currentTitle; //2.1 把文字显示到答案按钮上 for(UIButton *answerBtn in self.answerView.subviews){ //判断每个答案按钮上的文字是否为nil if(answerBtn.currentTitle == nil){ //把当前点击的待选按钮的文字设置给对应的答案按钮 [answerBtn setTitle:text forState:UIControlStateNormal]; //把当前点击的待选按钮的tag值也设置给对应的答案按钮 answerBtn.tag = sender.tag; break; } } //3.判断答案按钮是否已经填满了 //一开始假设答案按钮是填满的 BOOL isFull = YES; //声明一个用来保存用户输入的答案的字符串 NSMutableString *userInput = [NSMutableString string]; for(UIButton *btnAnswer in self.answerView.subviews){ if(btnAnswer.currentTitle == nil){ ifFull = NO; break; }else{ //如果当前答案按钮上面有文字,那么就把这个文字拼接起来 [userInput appendString:btnAnswer.currentTitle]; } } //如果已经填满,则禁止 option view 与用户交互 if(isFull){ //禁止待选按钮被点击 self.optionsView.userInteractionEnabled = NO; //获取当前题目的正确答案 TestQuestion *model = self.questions[self.index]; //4.如果答案按钮被填满了,那么就判断用户点击输入的答案是否与标准答案一致 if([model.answer isEqualToString:userInput]){ //0.如果正确,则+100分,这节课主要写这里 //如果要点一下“提示”按钮,是不是要扣100分, //也就是说,我们这个地方,涉及到,有些时候会加分,有些时候会扣分,加分和扣分的分值,是不是可能会不一样, //所以说,我们这里,是不是应该单独把加分和扣分的功能,也提取到一个方法里面, //把加分和扣分的功能,也提取到一个单独的方法里面, //所以说,我们这里给它再提取一个方法,这个方法干什么,addScore吧,所以,方法的名字叫做addScore,参数有吗,来一个(int)score,这里面的方法,就是根据指定的分数,为我们的标签加分或者减分, [self addScore:100]; //每次答对,就加100分, //1.如果一致,则设置答案按钮的文字颜色为蓝色,同时在0.5秒之后跳转到下一题 //1.1设置所有的答案按钮的文字颜色为蓝色 [self setAnswerButtonsTitleColor:[UIColor blueColor]]; //1.2 延迟0.5秒后,跳转到下一题 [self performSelector:@selector(nextQuestion) withObject:nil afterDelay:0.5]; }else{ //2.如果答案不一致(答案错误),设置答案按钮的文字颜色为红色 //2.1设置所有的答案按钮的文字颜色为红色 [self setAnswerButtonsTitleColor:[UIColor redColor]]; } } } //根据指定的分数,来对界面上的按钮进行加分和减分 - (void)addScore:(int)score{ //其实,无论是加分还是减分,这里传一个值就可以了,加分传一个正数,减分传一个负数,就OK了, //要进行加分或者减分,首先第一步,你要先拿到现在界面上这个分数吧,拿到这个分数以后,把它转成数字类型,然后对这个数字类型相加减,最后再把数字再设置给按钮,所以,第一步: //1)获取按钮上现在的分值, //2)把这个分值转换成数字类型, //3)对这个分数进行操作, //4)把新的分数设置给按钮, //1)获取按钮上现在的分值,怎么获取按钮上现在的分值呢,假设它是一个字符串类型,这个按钮是不是叫btnScore啊,它的currentTitle,就是现在的分值吧, NSString *str = self.btnScore.currentTitle; //2)把这个分值转换成数字类型,怎么把这个字符串转换成数字类型呢,字符串是不是有一个属性,叫做intValue吧,转换成整数,这个属性, int currentScore = str.intValue; //3)对这个分数进行操作,如果你这个score是个正数,就是加分,如果你这个score是个负数,就是减分, currentScore += score; //4)把新的分数设置给按钮 self.btnScore setTitle: //怎么写,我们说这里是个数字类型,但是我们要的是一个字符串类型,怎么写,拼接吧,[NSString stringWithFormat:@“%d”,currentScore] [self.btnScore setTitle:[NSString stringWithFormat:@“%d”,currentScore] forState:UIControlStateNormal]; //这样的话,是不是拿到一个分数,对这个分数进行操作以后,把这个新的分数再赋值给按钮,OK了, //接下来,我们每次要加分的时候,怎么写,[self addScore:100]; } 所以,回到我们的optionButtonClick方法,去写上[self addScore:100]; 二、好了,这是我们这么一个效果,接下来,我们再去实现另外一个效果,就是当你点击“提示按钮”的时候,是不是要减100分,然后显示答案按钮的第一个文字啊, 1.当你点完“提示”按钮时候,是不是要减分,光是减分吗,减完分是不是还得干活儿啊, 比如说,点开一个图片,认识吗,不认识,不认识怎么办,提示一下吧,提示一下, 又或者说,我这里是不是填错了,填错了怎么办,怎么都想不出来这个人叫什么吧,怎么办,提示一下吧,注意看,一点提示,是不是所有答案按钮都清空了,只留下第一个答案按钮,是正确的文字吧, 3.第一,这儿是不是减分了,减了1000分, 第二, 是不是把所有文字都让回去了, 第三, 是不是让第一个答案按钮显示正确答案了,第一个文字是显示正确答案了,这儿正确答案的第一个文字是不是显示到第一个按钮上了,是不是就是这么三步啊, 4.怎么实现, 1)有人问了,再点“提示”会怎么样,再点“提示”,接着扣被,可以扣成负分儿,这就叫Bug, 2)有人说了,怎么解决这个Bug,你可以点完“提示”以后,做个标记,是不是再点“提示”,如果还是同一道题的话,是不是不做任何操作了,做个标记就OK了, 3)所以说,现在我们先实现一下,是不是点“提示”,就让这个分数减一下,减1000分, 然后把这个答案按钮上的所有文字都让它回去, 然后再从当前这个题目中,找到那个正确答案,把正确答案中的第一个字符,找到对应的option按钮,让它显示到第一个答案按钮上啊, 这就是我们这儿要做的这几步操作, 5.好了,接下来,我们这个“提示”按钮,是不是还没有拖线,我们先给它拖线, 打开辅助编辑器,把“提示”按钮拖到ViewController.m文件的延展里,输入6个参数: 1)第一个参数,Connection,Action, 2)第二个参数,Object,View Controller, 3)第三个参数,Name,btnTipClick, 4)第四个参数,Type,id, 5)第五个参数,Event,Touch Up Inside, 6)第六个参数,Argument,None, 点击Connect, 自动生成了这个单击事件: //点击“提示”按钮 - (IBAction)btnTipClick; //点击“提示”按钮 - (IBAction)btnTipClick{ //1.在点击提示按钮里面,第一步要干什么,分数-1000 //2.把所有的答案按钮“清空”,但是注意,这个清空,可不是简单的把文字清空,你这儿的清空其实就是干什么,让每一个答案按钮点一下就OK了, //因为如果你仅仅是把这个答案按钮上的文字清空的话,但是我现在希望能点的时候,把这个答案按钮清空的同时,是不是让下面这个待选项按钮显示出来,所以说,其实你清空的就是让答案按钮的每一个答案按钮调一下它的单击事件吧,是不是它自动就都回去了吧,是不是这个意思, //同时,文字是不是还都变成黑色了,所以说,清空的意思,其实是最好是就是调用每个答案按钮的单击事件吧, //2.把所有的答案按钮“清空”(其实这里的“清空”最好是调用每个答案按钮的单击事件) //因为,在这个答案按钮的单击事件里面,它自动就会把这个答案按钮清空,把答案按钮对应的下面的option按钮显示出来,把背景色,把所有答案按钮的文字颜色设置为黑色,是不是这些都会自动执行啊, //所以说,省的我们再一步一步去执行了, //3.第三步,根据当前的索引,从数据数组中(self.questions)中找到对应的数据模型,找到数据模型,然后呢, //从数据模型中获取正确答案的第一个字符,把待选按钮中和这个相等的那个待选按钮点击一下,点击一下,是不是就上去了,所以我们需要实现的效果,就是这里这些,就是这三步,一步步来做 } //点击“提示”按钮 - (IBAction)btnTipClick{ //1.分数-1000,还需要你再写代码吗,不需要了吧, [self addScore:-1000]; //2.把所有的答案按钮“清空”(其实这里的“清空”最好是调用每个答案按钮的单击事件) //我们让每一个答案按钮点击一下,这些代码其实也很简单了,因为我们点击代码的东西写完了,调self 的 btnAnswerClick事件,把每一个答案按钮传进来,这样就是让每一个答案按钮点击一下, for(UIButton *btnAnswer in self.answerView.subviews){ //让每个答案按钮点击一下 [self btnAnswerClick:btnAnswer]; //没空也点,我不管,我这儿不想判断那么多,不和它废话,每一个答案按钮都点一下就完事儿,来,点开看看,这个是答案按钮的单击事件,btnAnswerClick,按住command键,点开它看看,在这个里面,是不是把当前被点击的这个答案按钮,是不是先怎么怎么样,再怎么怎么样: } //参数sender,就表示当前点击的答案按钮 - (void)btnAnswerClick:(UIButton *)sender{ //0.启用option view与用户的交互 self.optionsView.userInteractionEnabled = YES; //1.设置所有的答案按钮的文字颜色为黑色 [self setAnswerButtonsTitleColor:[UIColor blackColor]]; //2.在待选按钮里找到与当前被点击的答案按钮tag相同的待选按钮,设置该待选按钮显示出来, for(UIButton *optBtn in self.optionsView.subviews){ if(sender.tag == optBtn.tag){ optBtn.hidden = NO; break; } } //1.清空当前被点击的答案按钮的文字 [sender setTitil:nil forState:UIControlStateNormal]; } //你要做的就是,让这个答案按钮,你把它点一下,就OK了, //点击提示按钮 - (IBAction)btnTipClick{ //1.分数-1000 [self addScore:-1000]; //2.把所有的答案按钮“清空”(其实这里的“清空”最好是调用每个答案按钮的单击事件) for(UIButton *btnAnswer in self.answerView.subviews){ //让每个答案按钮点击一下 [self btnAnswerClick:btnAnswer]; } //3.根据当前的索引,从数据数组中(self.questions)中找到对应的数据模型 //从数据模型中获取正确答案的第一个字符,把待选按钮中和这个字符相等的那个按钮点击一下, //第三步,从模型中取出当前这条数据的模型,怎么取,咋办,是不是获取了当前我们这条数据的模型了 TestQuestion *model = self.questions[self.index]; //然后,是要从这个模型中取到那个正确答案的第一个字符吧,怎么写: NSString *firstChar = model.answer; 这是不是正确答案啊,从这个正确答案里获取第一个字符吧,怎么写,是不是截取字符串,怎么截取,是不是subString吧,是不是我要提取一个字符串, 1)第一个什么意思,NSString * substringFromIndex:(NSUInteger), 从给定的索引开始截取,一直截取到最后, 2)第二个什么意思,NSString * substringToIndex:(NSUInteger), 从第0个索引开始截取,是不是一直截取到Index这个索引, 3)第三个什么意思,NSString * substringWIthRange:(NSRange), 从给定的这个范围内开始截取吧, 我们可以调第二个,直接从第0个索引开始截取,截取到1,是不是就只截取1个字符,截取0-1,这就是只截取一个字符,是不是就第一个字符串啊,这算成第一个字符,截取到以后, //3.根据当前的索引,从数据数组中(self.questions)中找到对应的数据模型 //从数据模型中获取正确答案的第一个字符,把待选按钮中和这个字符相等的那个按钮点击一下, TestQuestion *model = self.questions[self.index]; //截取正确答案中的第一个字符“字符串” NSString *firstChar = [model.answer substringToIndex:1]; //拿到它以后,是不是根据正确答案,找到option按钮的值,然后是给它,就是点一下,这个按钮就可以了,接下来,根据firstChar //根据firstChar在option按钮中找到对应的option按钮,让这个按钮点一下, //知道怎么去找吗,你想想咋找,是不是就是遍历啊,如果当前这个按钮的currentTitle isEqualToString这个firstChar,是不是就是找到了, for(UIButton *btnOpt in self.optionsView.subviews){ if([btnOpt.currentTitle isEqualToString:firstChar]){ [self btnOptionClick:btnOpt]; break; } } 当前这个控制器里面,有一个叫做btnOptionClick,这个待选按钮单击事件啊,让当前这个按钮点一下,就是把当前这个按钮,btnOpt传给它,点完以后,是不是要break一下啊, 可以了吧,这是当我们点击这个“提示”按钮的时候, 1)首先,先扣分,分数-1000, 2)再让每个答案按钮都点一下, 3)再找到你正确答案里面第一个字符串,再根据这个字符串,去这个待选项按钮里面找到对应的那个待选按钮,找到是哪个按钮,让这个待选按钮点击一下,就OK了 来,运行一下看看,可以了吧, 好,这就是我们这个加分功能和“提示按钮”功能,