Hướng dẫn lập trình macOS (phần cuối)

Ở phần trước chúng ta đã làm xong giao diện và chức năng của menu Preference, tuy nhiên chức năng đó vẫn chưa được áp dụng vào trong ứng dụng của chúng ta, nó chỉ đơn thuần xử lý về mặt giao diện chứ chưa được liên kết chức năng. Chúng ta sẽ hoàn thiện hoàn toàn ứng dụng trong phần cuối này cộng với việc thêm một chút âm thanh để cho ứng dụng của chúng ta sống động hơn.

Thực hiện Preference được chọn

Đầu tiên là chỉnh sửa file ViewController.swift để lưu trữ thời gian và để lắng nghe Notification về việc thời gian bị thay đổi hoặc làm mới.

Thêm extension sau vào ViewController.swift :

Đoạn code trên sẽ gây ra lỗi, bởi vì ViewController không có đối tượng prefs. Trong class ViewController nơi mà bạn khai báo eggTimer, hãy thêm đoạn sau:

Bây giờ, PrefsViewControllerViewController đều có đối tượng prefs, lý do:

  1. PrefsViewController là một struct, vì vậy nó là dạng value không phải dạng preference. Mỗi View Controller đều có một đối tượng riêng biệt.
  2. Preferences tương tác với UserDefaults thông qua một singleton, vì vậy mà tất cả các đối tượng đều dùng chung một UserDefaults và lấy cùng một dữ liệu.

Thêm đoạn code sau vào đoạn cuối cùng của hàm viewDidLoad :

Còn một điều cuối cùng mà chúng ta cần làm. Trước kia chúng ta đã hard-code giá trị thời gian - 360 giây hoặc 6 phút. Bây giờ ViewController đã sử dụng Preferences, chúng ta sẽ phải đổi 360 thành prefs.selectedTime.

Tìm đến 360 trong ViewController.swift và thay đổi giá trị trong prefs.selectedTime, bạn nên tìm 3 chỗ.

Hãy chạy ứng dụng, Nếu như bạn đã thay đổi giá trị thời gian luộc trứng, thì thời gian hiện ở trên màn hình chính sẽ thay đổi. Vào trong Preferences, chọn một thời gian khác, bấm OK , thời gian mới sẽ được hiển thị ngay trên ViewController

Hãy ấn nút start để bắt đầu thời gian luộc trứng, sau đó vào Preferences thay đổi thời gian luộc trứng. Bộ đếm thời gian sẽ dừng thời gian hiện tại, thay đổi bằng thời gian mới. Việc này hết sức bình thường, tuy nhiên để tăng trải nghiệm cho người dùng, chúng ta nên thêm một dialog thông báo vào đây để người dùng có thể lựa chọn tuỳ theo mục đích mà họ muốn.

Trong extension của ViewController để xử lý Preferences :

  1. Nếu như thời gian dừng lại, làm mới thời gian bình thường.
  2. Tạo một NSAlert để hiện dialog thông báo. Sửa tiêu đề và nội dung phù hợp.
  3. Thêm 2 nút : Reset và Cancel. Chúng sẽ hiện từ phải sang trái theo thứ tự.
  4. Hiện dialog thông báo và chờ đợi câu trả lời. Làm mới thời gian nếu người dùng chọn Reset.

Trong setupPrefs, thay đổi self.updateFromPrefs() thành

Hãy chạy ứng dụng và thay đổi thời gian, chúng ta sẽ có kết quả :

Âm thanh

Đầu tiên hãy lấy file âm thanh sau về ding.mp3. Kéo file ding.mp3 vào trong Project Navigator vào trong EggTimer ngay dưới Main.storyboard. Đảm bảo rằng bấm vào Copy items if needed.Sau đó bấm finish.

Để bật âm thanh, bạn cần phải dùng thư viện AVFoundation. ViewController sẽ bật âm thanh khi bộ đếm thời gian kết thúc việc đếm. Chuyển sang file ViewController.swift. Hãy thêm đoạn code sau:

ViewController sẽ cần phải có một player để bật âm thanh:

Chúng ta sẽ tạo một extension riêng biệt cho ViewController để quản lý phần code âm thanh.

prepareSound sẽ làm tất cả công việc cho chúng ta, đầu tiên nó sẽ kiểm tra xem file ding.mp3 có tồn tại không. Nếu có thì khời tạo AVAudioPlayer cùng với địa chỉ của file. Điều này sẽ làm cho file âm thanh được tải vào vùng nhớ đệm và được bật ngay lập tức khi ta cần.

playsound sẽ gửi đoạn tin cho player nếu như nó tồn tại. Nhưng nếu prepareSound bị lỗi, soundPlayer sẽ bị nil và sẽ không có gì xảy ra.

Hãy thêm dòng sau vào hàm startButtonClicked để tiến hành bật âm thanh.

và trong timerHasFinished vào trong EggTimerProtocol, thêm dòng sau:

Chạy ứng dụng và chúng ta sẽ có kết quả:

Đến đây là kết thúc , qua loạt series này mong các bạn có thể gặt hái được nhiều kinh nghiệm để ứng dụng vào công việc sau này, chúc các bạn thành công, cảm ơn đã theo dõi.

Ref: https://www.raywenderlich.com/151748/macos-development-beginners-part-3