Monday, September 11, 2017

Bài 2 – Chuyển sang màn hình mới, textField, Toast

Nháy chuột phải vào folder baidau, new file.


Chọn CoCoa Class, đặt tên là second, chuyển chuột xuống ô dưới để chữ Next hiện lên, Create.
Sửa import thành import UIKit sẽ hết lỗi đỏ.

Bây giờ nháy vào Main.storyboard,
Ở dưới bên phải, chỗ Object library, nháy chuột phải vào view Controller, giữ, kéo nó vào trong storyboard, cứ để đè lên cái đang có cũng được.

Trên đỉnh của nó, bạn nháy chuột để cái chấm vàng ngoài cùng hiện màu xanh
Phía trên bên phải, tìm cái biểu tượng có tên identity inspector, chỗ ô class, nháy chấm xanh góc phải để nó xổ ra, tìm xuống dưới chọn class second.

Bây giờ quay về second.swift, copy lệnh viewDidLoad vào
override func viewDidLoad() {
        super.viewDidLoad()
}

Khai báo một Label
var la: UILabel!
Định vị, nhập chữ “Nhập năm dương lịch”, đổ nền cho view là màu trắng
la = UILabel(frame: CGRect(x: 100, y: 30, width: 280, height: 25))
la.text = "Nhập năm dương lịch"
la.textColor = UIColor.blueColor()
view.backgroundColor = UIColor.whiteColor()
view.addSubview(la)
thêm luôn đoạn code để làm mất thanh bar bên trên
override func prefersStatusBarHidden() -> Bool {
        return true
    }
Class second giờ trông như sau

Quay về ViewController.swift, copy đoạn sau vào trước cái ngoặc dóng dưới cùng
func nutnext(sender: UIButton){
  let vc = second()
  self.presentViewController(vc, animated: true, completion: nil)
    }
Đây là ta code lệnh cho cái nút Next để chuyển nó sang màn hình thứ hai.
Tiếp theo là gắn nó vào nút, copy đoạn sau vào trong viewDidLoad
bu2.addTarget(self, action: #selector(ViewController.nutnext(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Bây giờ ấn nút chạy thử, ấn nút next, màn hình thứ hai bật ra trông như sau

Trở lại class second.swift, khai báo một textField dùng để nhập chữ vào, copy lên trên chỗ override.
var nhap:UITextField!
Tiếp theo ta định vị, đổ màu nền, yêu cầu bàn phím số, copy các lệnh sau vào trong viewDidLoad
nhap = UITextField(frame: CGRect(x:130, y: 70, width: 100, height: 40))
        nhap.backgroundColor = UIColor.lightGrayColor()
        nhap.textAlignment = NSTextAlignment.Center
        nhap.placeholder = "Dương lịch"
        nhap.adjustsFontSizeToFitWidth = true
        nhap.font=UIFont.systemFontOfSize(14)
        nhap.keyboardType = UIKeyboardType.PhonePad
Nhét vào view nữa là xong view.addSubview(nhap)

Chạy thử để thấy màn hình 2 đã có ô nhập chữ.

Nếu nháy chuột vào ô textField mà không thấy bàn phím, tại màn hình máy ảo, góc trên bên trái, nháy vào Hardware, Keyboard,chọn dòng trên cùng, use the same layout as OS X.

Khai báo thêm 2 Label, 2 nút bấm
var la2: UILabel!
    var la3: UILabel!
    var bu1:UIButton!
    var bu2:UIButton!
Định, đặt tên, tô màu chữ cho chúng
la2 = UILabel(frame: CGRect(x: 120, y: 125, width: 280, height: 25))
        la2.text = "Năm âm lịch là:"
        la2.textColor = UIColor.blueColor()
        la3 = UILabel(frame: CGRect(x: 140, y: 155, width: 280, height: 25))
        la3.textColor = UIColor.redColor()
        bu1 = UIButton(frame: CGRect(x:80, y: 190, width: 100, height: 32))
        bu2 = UIButton(frame: CGRect(x:200, y: 190, width: 100, height: 32))
        bu1.setTitle("Đổi năm",forState: .Normal)
        bu1.setTitleColor(UIColor.blueColor(), forState: .Normal)
        bu1.backgroundColor = UIColor.lightGrayColor()
        bu2.setTitle("Quit",forState: .Normal)
        bu2.setTitleColor(UIColor.blueColor(), forState: .Normal)
        bu2.backgroundColor = UIColor.lightGrayColor()
Nhét vào view.
view.addSubview(bu1)
        view.addSubview(bu2)
        view.addSubview(la2)
        view.addSubview(la3)
       
Chạy thử để chắc chắn ta đã làm đúng đến đây.

Tiếp theo ta copy phương thức canchi vào trên dấu đóng ngoặc cuối cùng
func canchi(nam:Int)-> String {
    let soducan = nam % 10
    var Can = ""
    if (soducan == 1) {
    Can = "Tân"
    }
    else if (soducan == 2) {
    Can = "Nhâm"
    }
    else if (soducan == 3) {
    Can = "Quý"
    }
    else if (soducan == 4) {
    Can = "Giáp"
    }
    else if (soducan == 5) {
    Can = "Ất"
    }
    else if (soducan == 6) {
    Can = "Bính"
    }
    else if (soducan == 7) {
    Can = "Đinh"
    }
    else if (soducan == 8) {
    Can = "Mậu"
    }
    else if (soducan == 9) {
    Can = "Kỷ"
    }
    else {
    Can = "Canh"
    }
    let soduchi = nam % 12
    var Chi = "";
    if (soduchi == 1) {
    Chi = "Dậu"
    }
    else if (soduchi == 2) {
    Chi = "Tuất"
    }
    else if (soduchi == 3) {
    Chi = "Hợi"
    }
    else if (soduchi == 4) {
    Chi = "Tý"
    }
    else if (soduchi == 5) {
    Chi = "Sửu"
    }
    else if (soduchi == 6) {
    Chi = "Dần"
    } else if (soduchi == 7) {
    Chi = "Mão"
    }
    else if (soduchi == 8) {
    Chi = "Thìn"
    }
    else if (soduchi == 9) {
    Chi = "Tỵ"
    }
    else if (soduchi == 10) {
    Chi = "Ngọ"
    }
    else if (soduchi == 11) {
    Chi = "Mùi"
    }
    else {
    Chi = "Thân"
    }
    return Can + " " + Chi
    }
Phương thức này đổi một năm dương thành năm âm lịch gồm can và chi
Tiếp theo copy phương thức Toast để cho ra màn hình thông báo tới người dùng. Vì Swift không có sẵn như Android nên ta phải tự làm phương thức này.
func toast(t:String){
        let toastLabel = UILabel(frame: CGRectMake(self.view.frame.size.width/2 - 150, 150, 300, 35))
        toastLabel.backgroundColor = UIColor.blackColor()
        toastLabel.textColor = UIColor.whiteColor()
        toastLabel.textAlignment = NSTextAlignment.Center;
        self.view.addSubview(toastLabel)
        toastLabel.text = t
        toastLabel.alpha = 1.0
        toastLabel.layer.cornerRadius = 10;
        toastLabel.clipsToBounds  =  true
        UIView.animateWithDuration(4.0, delay: 0.5, options: .CurveEaseOut, animations: {
           
            toastLabel.alpha = 0.0
           
            }, completion: nil)
    }
Nhớ copy cho đúng chỗ, không bị hiện dấu đỏ nào.
Tiếp theo là hai phương thức điều khiển 2 cái nút bấm, copy tiếp vào
func nut1(sender: UIButton){
        let nam = nhap.text
        if(nam == ""||nam == " "){
            toast("Bạn chưa nhập năm sinh")
        }
        else{
                if let myNumber = NSNumberFormatter().numberFromString(nam!) {
                let namduong = myNumber.integerValue
                let namam=canchi(namduong)
                 la3.text = namam
                   
            }
            else{
                toast("Dữ liệu nhập vào không hợp lệ");
            }
        }
    }
     func nut2(sender: UIButton){
        self.dismissViewControllerAnimated(true, completion: nil)
    }
Phương thức nut1 lấy giá trị của TextField, kiểm tra nếu rỗng thì thông báo chưa nhập gì, nếu đã nhập thì chuyển nó thành số rồi gọi phương thức canchi đổi ra năm âm lịch và set vào Label thứ 3.
Nếu người dùng nhập lẫn ký tự khác số thì thông báo để nhập lại.
Phương thức nut2 chỉ đơn giản là thoát về màn hình trước.
Nếu bạn làm đúng, code trông như sau

Chạy thử, thay đổi năm để xem năm âm lịch đổi theo, thử không nhập gì, sẽ có thông báo ra màn hình.
Thử nhập kèm dấu sao, chấm, phảy xem sao. Ấn nút Quit để thoát.


Như vậy bài này ta đã làm ứng dụng đổi dương lịch ra âm lịch. ta học cách mở ra một màn hình mới, trở về màn hình trước, thêm class và gắn nó vào storyboard.
Ta cũng học cách dùng TextField để lấy dữ liệu người dùng nhập vào, sử dụng tính toán ra năm âm lịch.
Hãy nhìn chữ self trong lệnh Toast, nó chỉ cái view hiện tại nhưng bạn không biết cũng chả sao, vì nó là thủ tục, cứ copy cả đoạn lệnh là được rồi.
Do đó học bằng thực hành lợi như vậy. Rất nhiều từ khóa ta không cần biết nó là gì, chỉ cần biết cả đoạn lệnh ấy nó làm cái gì, như với Toast là để gửi thông báo ra màn hình cho người dùng. Thế là lần sau chỗ nào cần ta cứ copy cả đoạn vào.

Khỏi cần đọc lý thuyết nhức óc chả tích sự gì.

No comments:

Post a Comment