CHƯƠNG 2 THIẾT KẾ GIAO DIỆN VÀ XỬ LÝ SỰ KIỆN TRÊN IOS
2.2 Xử lý sự kiện trên iOS
2.2.3 Hoàn thiện ứng dụng Calculate giai đoạ n1
Giai đoạn 1 của ứng dụng cần xử lý nhiều thao tác như mỗi khi tap trên một đối tượng button cụ thể thì thay vì hiện kết quả trên màn hình consol của Xcode thì giá trị số được chạm sẽ hiện trên màn hình kết quả của máy tính; xử lý các trường hợp số khơng đầu tiên, xử lý các phím chức năng…
Trước tiên chúng ta đưa kết quả của các phím số lên màn hình của ứng dụng Calculator: Thực hiện kết nối màn hình Calculator UILabel với code theo dạng tham chiếu và đặt tên là calDisplay.
Bước 1: Hãy sửa hàm buttonPess(sender:) sao cho mỗi khi một button được chạm vào thì giá trị số tương ứng được ghi dồn vào màn hình của Calculator như sau:
Hình 2.2.2.1 Kết quả điều chỉnh giao diện giai đoạn 1
//MARK: Calculator behaviors
@IBAction func buttonPress(_ sender: UIButton) { let digit = sender.currentTitle!
let currentCalDisplay = calDisplay.text! calDisplay.text = currentCalDisplay + digit }
Biến currentCalDisplay sẽ lưu giá trị hiện tại trên màn hình Calculator trước khi được nối với số vừa được chạm vào (digit). Chạy chương trình và ta thu được kết quả như hình 2.2.2.2. Tuy nhiên, rõ ràng đó chưa phải kết quả mong muốn vì số 0 ban đầu vẫn được nối vào trước của số được chọn trên màn hình máy tính, điều này khơng đúng với thực tế. Ngoài ra cũng cần xét thêm trường hợp nếu nút đầu tiên được chạm cũng là nút số 0 thì cũng khơng được phép gắn nó lên màn hình Calculator (trừ khi nó được chạm sau khi trên màn hình đã có các số khác 0). Hãy sửa lại hàm buttonPress(sender:) như sau để có kết quả mong muốn:
//MARK: Properties
@IBOutlet weak var calDisplay: UILabel! var isTyping = false
//MARK: Calculator behaviors
60
let digit = sender.currentTitle! if isTyping {
let currentCalDisplay = calDisplay.text! calDisplay.text = currentCalDisplay + digit } else { if digit != "0" { calDisplay.text = digit isTyping = true } } }
Hãy chạy chương trình, tap vào các phím số với mọi khả năng có thể có và cho kết luận! Bước 2: Thêm phím chức năng và kết nối code dạng hành vi cho các chức năng này với hàm có tên là calFunctions(sender:) với cùng sự kiện là Touch Up Inside như các phím số trước đây để có kết quả như Hình 2.2.2.3. Lưu ý: Để có thể đưa giá trị các phím chức năng như ∏, … vào các button cần truy xuất vào bảng ký tự đặc biệt trong Xcode để lấy (Hình 2.2.2.4). Trong bước này, tạm thời chúng ta sẽ thêm 3 phím chức năng là phím lấy giá trị Pi, e và lấy căn bậc hai.
Mỗi khi một phím chức năng được chạm thì chức năng tương ứng sẽ được thực hiện. Trong trường hợp của chúng ta thì:
- Chức năng ∏: Màn hình Calculator sẽ hiện giá trị của số Pi.
- Chức năng e: Màn hình Calculator sẽ hiện giá trị của số e.
Hình 2.2.2.2 Kết quả điều chỉnh chương trình
- Chức năng √: Màn hình Calculator sẽ hiện kết quả phép tính căn bậc hai của giá trị hiện tại trên màn hình của máy tính. Rõ ràng ở đây cần xử lý khéo léo giữa phím chức năng và phím số, nếu khơng ứng dụng sẽ hoạt động hỗn loạn.
Điều chỉnh code trong hàm mới kết nối như sau:
@IBAction func calFunctions(_ sender: UIButton) {
if let mathSymbol = sender.currentTitle { isTyping = false
switch mathSymbol {
case "∏": calDisplay.text = String(Double.pi) case "e": calDisplay.text = String(M_E) case "√":
if let operand = Double(calDisplay.text!) { calDisplay.text = String(sqrt(operand)) }
default:
print("This is not a function") }
} }
Lưu ý:
- Mỗi khi hàm chức năng được gọi thì cần xố lại trạng thái isTyping về false để đảm bảo sau khi gọi phím chức năng thì các phím số vẫn hoạt động như bình thường.
- unWrap code an tồn cho trường hợp tính căn bậc hai, để tránh trường hợp khơng lấy được giá trị.
Hình 2.2.2.3 Bổ sung phím chức năng cho máy tính
62
Computed Variable và việc hồn thiện chương trình Calculator giai đoạn 1:
Trong ứng dụng trên, mỗi khi sử dụng phím chức năng và phím số, rõ ràng ln cần sự chuyển đổi giữa String và giá trị số tương ứng của màn hình Calculator. Điều này có thể giải quyết dễ dàng trong các ứng dụng iOS với kiểu biến tính tốn (Computed Variable) trong Swift. Biến tính tốn cho phép định nghĩa các hàm get và set để thực hiện các thao tác chuyển đổi, tính tốn tương ứng trước khi sử dụng và khi sử dụng giống như ta đưa/lấy trực tiếp giá trị Double vào/ra màn hình calDisplay của máy tính. Sửa lại code trong chương trình như sau:
var disPlayValue: Double {
get {
if let value = Double(calDisplay.text!) { return value } else { return 0 } } set { calDisplay.text = String(newValue) } }
@IBAction func calFunctions(_ sender: UIButton) { if let mathSymbol = sender.currentTitle { isTyping = false
switch mathSymbol {
case "∏": disPlayValue = Double.pi case "e": disPlayValue = M_E
case "√":
disPlayValue = sqrt(disPlayValue) default:
print("This is not a function") }
} }