11. NSTimer và cùng làm ứng dụng "Trắc nghiệm vui"

iThanh
21/7/2013 12:0Phản hồi: 24
11. NSTimer và cùng làm ứng dụng "Trắc nghiệm vui"
Đổi gió một ti, mình sẽ học đối tượng NSTimer, đối tượng này không phải là cái có hình đồng hồ.
Nó là đối tượng giúp mình đếm thời gian hoặc lấy thời gian thực đấy các bạn.
Và thông qua việc tìm hiểu về NSTimer, các bạn sẽ được cùng với Thanh làm ứng dụng trắc nghiệm cho người dùng, với các câu hỏi đơn giản, và bạn sẽ có được thuật giải cơ bản cho việc sắp xếp dữ liệu (câu hỏi, đáp án, kết quả).
Hi vọng đây sẽ là tiền đề cho những Applications đầu tay của các bạn.
Chúc các bạn thành công!
File Project và Images: http://www.mediafire.com/folder/ivn9lw6kmji3c/Bài_11
24 bình luận
Chia sẻ

Xu hướng

Video bị tèo rùi
iThanh
ĐẠI BÀNG
11 năm
@allstreet Vì muốn giới thiệu cơ bản để bạn có cơ sở làm những ứng dụng sau này, nên mình nói hơi dài và tạo ra các lỗi để các bạn có thêm kinh nghiệm kiểm tra và sửa lỗi. Mình Upload vẫn chưa xong, nên các bạn chờ xíu xiu nữa nhé.
@iThanh
😁 b càng nói dài thì e càng thích, vì rất chi tiết và cụ thể, chúc b thật khỏe mạnh!
vi_tieu_bao
ĐẠI BÀNG
11 năm
xem hông đc hix
iThanh
ĐẠI BÀNG
11 năm
Tuần này sẽ có nhiều bài hướng dẫn.
Các bạn cố gắng cao độ và giành nhiều thời gian hơn để theo dõi cũng như thực hành nhé.
Video 11 trong 1h nữa sẽ xem được. Do đường truyền ở mình chậm quá. 😔
vi_tieu_bao
ĐẠI BÀNG
11 năm
@iThanh mới zô check vẫn chưa có. chắc sáng mai xem thui. g9
muốn down mấy cái video clip của b để lưu lại, mà sao hok dc. Nếu k phiền thì b có thể úp lên fshare dc k? 😁 thuận tiện cho cả 2 bên, b cũng có điểm thưởng.
vi_tieu_bao
ĐẠI BÀNG
11 năm
@allstreet dùng trang này nè bạn http://keepvid.com/. mạng iThanh bị chậm rùi up hết video lên nữa thì tội nghiệp iThanh lắm. ^^
em hỏi cái nếu k dùng win8 k sài MAC, k có iphone , có thể cài đặt và viết code được k ạ
iThanh
ĐẠI BÀNG
11 năm
@Đỗ Xuân Bút Trả lời với bạn luôn là không.
Bạn không có xe đạp thì làm sao đạp xe dạo vòng vòng Thành phố ngắm nữ sinh được ^^!;)
@iThanh Thích cái câu (Bạn không có xe đạp thì làm sao đạp xe dạo vòng vòng Thành phố ngắm nữ sinh được). Mình học tới bài 11 rồi, mình làm đúng theo bạn hướng dẫn nhưng tới khúc viết code

CacCauHoi = [NSArray arrayWithObject: @"......
CacCauTraLoi = [NS...
Dapan = [NS...

thì bị lỗi như thế này
Too many arguments to method call, expected 1, have 6

Nhờ bạn Thanh chỉ mình cách khắc phục với. Thanks bạn!
@nguyentri2010 Chắc dạo này bạn Thanh bận quá không thấy trả lời mình, nhưng mình tìm được nguyên nhân tại sao rồi. Mình post lên cho các bạn khác nếu bị lỗi giống mình thì khắc phục luôn, đó là do mình thiếu chữ s trong khai báo:
CacCauHoi = [NSArray arrayWithObjects: @"......
;)
Bài này hay quá...bắt tay và mò mẫm nghiên cứu làm nào 😁
Ngọc Ben
ĐẠI BÀNG
10 năm
Nó như kiểu setInterval trong javascript, gần giống với đệ quy
nguyen_manh
ĐẠI BÀNG
10 năm
Bài này hơi khó đối với mình. mình vẫn chưa hiểu gì nhiều về C. nhưng dù sao thì cũng cảm ơn bạn rất là nhiều @iThanh
chỗ set button [CauTiepTheo selected:NO]; chỉ cần chuyển lên trước khi xuất ra giao diện (tức là ngay sau lệnh else) là được mà nhỉ
Sao Mình toàn bị lỗi này nhỉ? mong a Thanh và các bạn Screen Shot 2014-02-27 at 10.46.22 PM.png giải đáp giúp ạ!
Ngọc Ben
ĐẠI BÀNG
10 năm
@teddy_kul CacPhuongAn chứ không phải CacDapAn theo như bạn khai báo ở trên.
@Ngọc Ben Ở đây mảng CacDapAn đã lưu toàn bộ thành phần của mảng CacPhuongAn đã loại bỏ đi dấu "-", mình thấy đúng mà......
Ngọc Ben
ĐẠI BÀNG
10 năm
@teddy_kul 😃 Thêm NSArray *CacDapAn; vào ViewController.h
Sorry nhé !
CacDapAn ở đây mình khai báo là biến cục bộ mà... đầu cần phải khai báo biến toàn cục đâu... 😃
Ngọc Ben
ĐẠI BÀNG
10 năm
@teddy_kul oài, nản nhỉ thế bạn sửa được lỗi chưa. cho xem cái project tý :v
Himura__
ĐẠI BÀNG
10 năm
Mình vừa đọc xong bài này, có một số thắc mắc:
- Cái NSTimer có tác dụng gì trong bài này
---
Để giống với thực tế thì:
- mỗi câu hỏi chỉ được chọn 1 lần,
- đặt thời gian cho từng câu hỏi
- khi hết thời gian sẽ không cho chọn Segment
code sao giờ nhỉ !^%&?
@Himura__ Bài của mình, post lên cho mọi người tham khảo và góp ý:

ViewController.h
PHP:
#import <UIKit/UIKit.h>

@interface ViewController UIViewController
{
    
IBOutlet UILabel *CauHoiSo;
    
IBOutlet UILabel *DemThoiGian;
    
IBOutlet UILabel *NoiDungCauHoi;
    
IBOutlet UILabel *DapAnA;
    
IBOutlet UILabel *DapAnB;
    
IBOutlet UILabel *DapAnC;
    
IBOutlet UISegmentedControl *ChonDapAn;
    
IBOutlet UILabel *DungSai;
    
IBOutlet UIButton *CauTiepTheo;

    
int i;
    
int Diem;
    
int CauHoiDangLam;
    
int SoCauSai;
    
NSTimer *ThoiGian;
    
NSArray *CacCauHoi;
    
NSArray *CacDapAn;
    
NSArray *DapAnDung;
}

- (
IBAction)ChonDapAn😔id)sender;

- (
IBAction)CauTiepTheo:(id)sender;

@
end
ViewController.m
PHP:
#import "ViewController.h"

@interface ViewController ()

@
end

@implementation ViewController

- (void)viewDidLoad
{
    [
super viewDidLoad];
    
// Do any additional setup after loading the view, typically from a nib.

    
30;
    
Diem 0;
    
SoCauSai 0;
    
CauHoiDangLam 0;
    
CacCauHoi = [NSArray arrayWithObjects:
                @
"Hãng nào đã sản xuất ra điện thoại thông minh iPhone?",
                @
"Tháng dài nhất có bao nhiêu ngày?",
                @
"Microsoft đã sản xuất ra hệ điều hành nào bên dưới?",
                @
"Hệ điều hành nào được sử dụng trên iPad",
                @
"Bác Hồ sinh ra vào năm nào?"nil];
    
CacDapAn = [NSArray arrayWithObjects:
                @
"Apple-Microsoft-Google",
                @
"29 ngày-30 ngày-31 ngày",
                @
"MacOS X-Windows-iOS",
                @
"iOS-Android-Windows",
                @
"1980-1890-1899"nil];
    
DapAnDung = [NSArray arrayWithObjects:
                @
"0",
                @
"2",
                @
"1",
                @
"0",
                @
"1"nil];;

    
ThoiGian = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(DemThoiGianuserInfo:nil repeats:YES];

    [
ChonDapAn setSelectedSegmentIndex:-1];
    [
CauHoiSo setText:[NSString stringWithFormat:@"Câu hỏi số %i:"CauHoiDangLam 1]];
    [
NoiDungCauHoi setText:[CacCauHoi objectAtIndex:CauHoiDangLam]];

    
NSArray *CacCauTraLoi = [[CacDapAn objectAtIndex:CauHoiDangLamcomponentsSeparatedByString:@"-"];
    [
DapAnA setText:[NSString stringWithFormat:@"Đáp án A: %@", [CacCauTraLoi objectAtIndex:0]]];
    [
DapAnB setText:[NSString stringWithFormat:@"Đáp án B: %@", [CacCauTraLoi objectAtIndex:1]]];
    [
DapAnC setText:[NSString stringWithFormat:@"Đáp án C: %@", [CacCauTraLoi objectAtIndex:2]]];
}

- (
void)didReceiveMemoryWarning
{
    [
super didReceiveMemoryWarning];
    
// Dispose of any resources that can be recreated.
}

- (
void)DemThoiGian
{
    
i--;
    [
DemThoiGian setText:[NSString stringWithFormat:@"Còn lại: %i giây"i]];
    if (
== 0) {
        [
ThoiGian invalidate];
        [
DungSai setText:[NSString stringWithFormat:@"Bạn được %i điểm. Sai %i/%i câu"DiemSoCauSaiCauHoiDangLam 1]];
        [
CauTiepTheo setTitle:@"Chơi lại" forState:UIControlStateNormal];
        [
ChonDapAn setEnabled:FALSE];
        
CauHoiDangLam = -1;
        
Diem 0;
        
SoCauSai 0;
    }
}

- (
IBAction)ChonDapAn:(id)sender {
    
NSInteger DapAnDuocChon = [ChonDapAn selectedSegmentIndex];
    
NSInteger DapAnChinhThuc = [[DapAnDung objectAtIndex:CauHoiDangLamintValue];
    [
ChonDapAn setEnabled:FALSE];
    if (
DapAnDuocChon == DapAnChinhThuc) {
        
Diem++;
        [
DungSai setText:[NSString stringWithFormat:@"Trả lời ĐÚNG câu %i"CauHoiDangLam 1]];
    } else {
        
SoCauSai++;
        [
DungSai setText:[NSString stringWithFormat:@"Trả lời SAI câu %i"CauHoiDangLam 1]];
    }
}

- (
IBAction)CauTiepTheo:(id)sender {
    [
ChonDapAn setEnabled:TRUE];
    [
ChonDapAn setSelectedSegmentIndex:-1];
    if (
CauHoiDangLam == -1) {
        [
CauTiepTheo setTitle:@"Câu tiếp theo" forState:UIControlStateNormal];
        
30;
        
ThoiGian = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(DemThoiGianuserInfo:nil repeats:YES];
    }
    if (
CauHoiDangLam == 3) {
        [
CauTiepTheo setTitle:@"Xem kết quả" forState:UIControlStateNormal];
    }
    if (
CauHoiDangLam == 4) {
        
// Xuất kết quả
        
[ThoiGian invalidate];
        [
DungSai setText:[NSString stringWithFormat:@"Bạn được %i điểm. Sai %i/%i câu"DiemSoCauSaiCauHoiDangLam 1]];
        [
CauTiepTheo setTitle:@"Chơi lại" forState:UIControlStateNormal];
        [
ChonDapAn setEnabled:FALSE];
        
CauHoiDangLam = -1;
        
Diem 0;
        
SoCauSai 0;
    } else {
        
CauHoiDangLam++;
        [
CauHoiSo setText:[NSString stringWithFormat:@"Câu hỏi số: %i"CauHoiDangLam 1]];
        [
NoiDungCauHoi setText:[CacCauHoi objectAtIndex:CauHoiDangLam]];
    
        
NSArray *CacCauTraLoi = [[CacDapAn objectAtIndex:CauHoiDangLamcomponentsSeparatedByString:@"-"];
        [
DapAnA setText:[NSString stringWithFormat:@"Đáp án A: %@", [CacCauTraLoi objectAtIndex:0]]];
        [
DapAnB setText:[NSString stringWithFormat:@"Đáp án B: %@", [CacCauTraLoi objectAtIndex:1]]];
        [
DapAnC setText:[NSString stringWithFormat:@"Đáp án C: %@", [CacCauTraLoi objectAtIndex:2]]];
    }
}
@
end
Fix lỗi như sau:
  • Sau khi giá trị Segment thay đổi, nó sẽ bị Disable đi: [ChonDapAn setEnabled:FALSE];
Khi hết thời gian (mình cho 30 giây để hoàn thành câu hỏi) thì:
  • Thời gian ngừng đếm: [ThoiGian invalidate];
  • Xuất ra kết quả
  • Các đáp án sẽ bị disable
  • Set title cho nút là Chơi lại: [CauTiepTheo setTitle: @"Chơi lại" forState:UIControlStateNormal];
  • Cho các biến đếm (Điểm, số câu sai, thời gian... trở về 0)
Khi trả lời xong 5 câu hỏi thì:
  • Thời gian ngừng đếm: [ThoiGian invalidate];
  • Xuất ra kết quả
  • Các đáp án sẽ bị disable
  • Set title cho nút là Chơi lại: [CauTiepTheo setTitle: @"Chơi lại" forState:UIControlStateNormal];
  • Cho các biến đếm (Điểm, số câu sai, thời gian... trở về 0)

Xu hướng

Bài mới









  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2024 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: Số 70 Bà Huyện Thanh Quan, P. Võ Thị Sáu, Quận 3, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019