Hướng dẫn lập trình macOS (phần 3 tiếp)

Ở phần trước chúng ta đã viết xong tất cả các hàm cho những button ở trên màn hình, cơ bản app của chúng ta đã chạy thành công nhưng vẫn chưa đủ. Những button ở trên thanh menu vẫn chưa được viết các hàm để hoạt động. Ở phần này chúng ta sẽ tiếp tục làm nốt các button ở trên thanh menu để hoàn thiện app của chúng ta.

Menu button

Các button có thể được hoạt động hoặc vô hiệu hóa dựa trạng thái của timer và các button timer ở trên Menu phải hoàn toàn phải phù hợp với trạng thái này.

Thêm hàm sau vào "View Controller", nằm trong phần extension.

Hàm này sử dụng trạng thái của "EggTimer" để điều chỉnh xem button nào sẽ được hoạt động và button nào bị vô hiệu hóa.

Ở trong phần 2, chúng ta đã tạo ra những button ở trên thanh menu và đặt thuộc tính của nó vào trong "AppDelegate", vì vậy chúng ta phải vào "AppDelegate" để tùy chỉnh chúng.

Chuyển sang "AppDelegate" và thêm hàm sau:

Vậy là thanh menu của chúng ta đã hoàn toàn được thiết lập khi app được chạy, thêm đoạn code sau vào trong "applicationDidFinishLaunching":

Các button ở trong app và các các button trên menu phải được đồng bộ với nhau dựa vào trạng thái của "EggTimer". Vì vậy quay lại "ViewController.swift" và thêm dòng sau vào cuối đoạn code của ba hàm thuộc ba button trong app.

Hãy chạy app và bạn sẽ thấy các button được hoạt động đúng theo như chúng ta dự đoán.

Preferences

Chỉ còn lại một vấn đề cho app của chúng ta. Giả sử như chúng ta muốn luộc trứng trong khoảng thời gian khác mà không phải là 6 phút.

Ở phần 2, chúng ta đã tạo ra một cửa sổ "Preference" để tùy chỉnh điều này. Cửa sổ đấy được điều khiển bởi "PrefsViewController", nhưng nó cần có một đối tượng model để lưu trữ dữ liệu.

Preferences sẽ được lưu trữ vào trong "UserDefaults", một cách để lưu trữ dựa vào key-value được cất trong thư mục Preference nằm trong app.

Chuột phải vào trong "Model" nằm trong "Project Navigator" và chọn "New File..." Chọn "macOS/Swift File" và chọn "Next". Đặt tên file là "Preference.swift" và bấm vào "Create". Thêm dòng code sau vào trong file này:

Chúng ta sẽ tạo ra một biến dựa vào getter và setter với "UserDefaults" để lưu trữ dữ liệu tự động.

Bây giờ hãy quay lại "PrefsViewController.swift", khi mà nhiệm vụ đầu tiên là phải cập nhật hiển thị sao cho đúng với dữ liệu đã được lưu.

Đầu tiên, thêm thuộc tính sau:

Sau đó thêm hàm sau:

  1. Lấy thời gian từ "selectedTime" và chuyển đổi nó từ giây sang phút.
  2. Đặt giá trị mặc định là "Custom" khi mà không có trường hợp nào gặp.
  3. Đặt vòng lặp vào trong button của menu nằm trong "presetsPopup" để kiểm tra tag của chúng. Các tag này đã được chúng ta đặt ở phần 2
  4. Đặt giá trị cho thanh trượt và gọi "showSliderValueAsText".
  5. "showSliderValueAsText" thêm phút vào trong text field.

Bây giờ, thêm dòng code sau vào "viewDidLoad":

Khi view được load, gọi hàm hiển thị lên các "Preferences" trong giao diện. Nhớ rằng chúng ta đang sử dụng MVC, đối tượng Model của "Preferences" hoàn toàn bị động và không biết khi nào được hiển thị lên, tuy nhiên điều này sẽ được "PrefsViewController" quản lý.

Bây giờ chúng ta đã có khả năng để đặt thời gian, nhưng chỉnh thời gian ở trong popup hiện đang không có tác dụng gì. Chúng ta cần một hàm để lưu dữ liệu mới và nói cho tất cả mọi nơi trong app biết được rằng dữ liệu đã thay đổi.

Trong đối tượng "EggTimer", chúng ta đã dùng delegate để chuyển dữ liệu đến nơi chúng ta cần. Ở lần này, chúng ta sẽ dùng "Notification" để truyền tải việc dữ liệu đã được thay đổi. Bất cứ đối tượng nào chọn theo dõi "Notification" này sẽ có hành động khi nó được kích hoạt lên.

Thêm hàm sau vào "PrefsViewController" :

Chúng ta sẽ lấy dữ liệu trên thanh trượt và đặt giá trị đó vào trong thuộc tính "selectedTime" mà chúng ta đã cho nó tự động lưu vào "UserDefaults". Và một "Notification" tên là "PrefsChanged" được đẩy vào trong "NotificationCenter".

Ngay lập tức, ta sẽ thấy được "ViewController" lắng nghe "Notification" và hành động.

Bước cuối cùng của "PrefsViewController"và đặt code vào trong "@IBAction" mà chúng ta đã tạo ra trong phần 2.

  1. Khi một item được chọn trong popup, kiểm tra xem nó có ở trong Custom Menu không. Nếu có, cho thanh trượt hoạt động và đi ra. Nếu không, dùng tag để lưu số phút, và dùng chúng để đặt giá trị cho thanh slider và vô hiệu hóa thanh trượt.
  2. Mỗi khi thanh trượt thay đổi, thay đổi text.
  3. Bấm vào Cancel sẽ đóng cửa sổ và không lưu giá trị.
  4. Bấm vào OK sẽ lưu giá trị vào "saveNewPrefs" sau đó đóng cửa sổ.

Chạy app, sau đó vào "Preferences". Chọn các giá trị khác nhau trong Popup - để ý xem thanh trượt và text có hoạt động không. Chọn Custom và chọn vào thời gian bạn mong muốn. Bấm OK, quay lại "Preferences" và xem thời gian bạn chọn có đúng không.

Bây giờ, hãy thoát app và chạy lại. Vào lại "Preferences" xem các tùy chỉnh của bạn đã được lưu chưa.

Ở phần cuối chúng ta sẽ thiết lập các Preferences vào trong việc luộc trứng và thêm một chút âm thanh để thể hiện trạng thái trứng chín. Cảm ơn các bạn đã theo dõi, hẹn gặp lại ở phần sau.

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