2015-09-09 59 views
8

Mục tiêu: Tôi đang cố khôi phục trạng thái trên ứng dụng dựa trên bộ điều khiển tab (với bộ điều khiển điều hướng trên mỗi tab).Khôi phục trạng thái trên thanh tab và điều khiển điều hướng ứng dụng

Sự cố: Khi khởi chạy lại, tab đã chọn có vẻ được khôi phục như mong đợi, nhưng phân cấp điều hướng bên trong tab đã nói thì không.

Phát triển:

  1. tôi lần đầu tiên bắt đầu với các mẫu dự án "Tab dựa ứng dụng".
  2. Tiếp theo, tôi đã thêm ID khôi phục cho cả bộ điều khiển chế độ xem con và trình điều khiển thanh tab.
  3. Trong đại biểu ứng dụng, tôi đã triển khai application(_:shouldSaveApplicationState:)application(_:shouldRestoreApplicationState:).

Sau đó tôi chạy ứng dụng, chuyển sang tab thứ hai (bên phải), nhấn vào nhà, chấm dứt. o khởi chạy lại, tab bên phải được hiển thị (như mong đợi). Cho đến nay rất tốt.

  1. Tiếp theo, tôi chuyển đến bảng phân cảnh và nhúng cả bộ điều khiển chế độ xem con trong trình điều khiển điều hướng tương ứng và gán ID khôi phục cho những người đó.

Tôi chạy ứng dụng và khôi phục vẫn hoạt động. Vẫn còn tốt.

  1. Tiếp theo, tôi thêm bộ điều khiển chế độ xem "chi tiết"; lớp của nó là lớp con tùy chỉnh của UIViewController với bảng phân cảnh, với các thuộc tính để định cấu hình nội dung của nhãn gỡ lỗi và màu nền của chế độ xem của nó.

  2. Tôi đã đặt nút "Hiển thị chi tiết ..." trên mỗi bộ điều khiển chế độ xem trên cùng của tab và tạo khoảng cách từ mỗi bộ điều khiển vào bộ chia sẻ chi tiết (được chia sẻ). Vì vậy, bây giờ storyboard của tôi trông giống như một hình lục giác (cũng có, cả hai segues có định danh được thiết lập trong giao diện Builder). Vì vậy, cả bộ điều khiển chế độ xem trên cùng bên trái và bên phải đều có cùng loại bộ điều khiển chế độ xem "chi tiết". Trên chương trình, nó được cấu hình để phân biệt nơi nó đã được đẩy (xem điểm tiếp theo).

  3. Trên mỗi phương pháp điều khiển chế độ xem trên cùng 'prepareForSegue(_:sender:), tôi định cấu hình bộ điều khiển chế độ xem chi tiết được đẩy khác: Văn bản và màu nền khác nhau ("trái" và xanh dương, "phải" và màu đỏ tương ứng).

  4. Tôi đã thêm mã vào bộ điều khiển chế độ xem chi tiết để lưu và khôi phục trạng thái của thuộc tính văn bản và màu nền: encodeRestorableStateWithCoder(_:)decodeRestorableStateWithCoder(_:). Ngoài ra, tôi đã triển khai viewDidLoad() để phản ánh các giá trị của thuộc tính đó trong chế độ xem. Bất cứ khi nào nó được khởi tạo và đẩy vào điều hướng thông qua một segue, các thuộc tính được thiết lập đầu tiên và sau đó được sử dụng để cấu hình khung nhìn trong viewDidLoad(). Bất cứ khi nào nó được khởi tạo trong quá trình phục hồi, các thuộc tính được đặt trong decodeRestorableStateWithCoder(_:) và được sử dụng tương tự trong viewDidLoad().

... nhưng khi tôi chạy mã này, tab chọn cuối cùng được phục hồi nhưng chỉ lên đến bộ điều khiển nhìn từ trên xuống -left hoặc right, không phải là chi tiết.Thật thú vị, màu nền cuối cùng được đặt thành bộ điều khiển chế độ xem chi tiết nhấp nháy ngay lập tức.

Tôi đã đặt các điểm ngắt trong encodeRestorableStateWithCoder(_:)decodeRestorableStateWithCoder(_:), nhưng chỉ một điểm đầu tiên được thực thi (mã hóa).

  1. Tự hỏi điều gì có thể bị thiếu, tôi đã tiếp tục và triển khai ứng dụng của đại biểu application(_:viewControllerWithRestorationIdentifierPath:coder:) (luôn trả về 0 nhưng ghi nhật ký thành phần đường dẫn).

Tài liệu không rõ liệu phương pháp này là cần thiết hay không, và trong mọi trường hợp, tất cả các trình điều khiển chế độ xem ngoại trừ chi tiết dường như được khôi phục hoàn hảo ngay cả khi không có. Tôi đã thêm mã để khởi tạo từng bộ điều khiển chế độ xem dựa trên thành phần đường dẫn cuối cùng (tức là ID khôi phục của bộ điều khiển đó) và trả về nó.

Hiện tại, decodeRestorableStateWithCoder(_:)được gọi là được gọi, nhưng điều hướng vẫn quay trở lại trình điều khiển chế độ xem trên cùng của tab sau một giây.

Vì vậy, những gì đang xảy ra? Tôi đang thiếu gì để thực hiện Bảo tồn và Phục hồi Nhà nước trong Tab Bar + Ứng dụng Điều hướng Điều hướng?

Trả lời

6

CỐ ĐỊNH: Vì vậy, đã có một số vấn đề với mã của tôi ...

  1. Nó chỉ ra rằng trong trường hợp của tôi, tôi không cần phải thực hiện application(_:viewControllerWithRestorationIdentifierPath:coder:). (Xem comments of this answer)

  2. triển khai của tôi về encodeRestorableStateWithCoder(_:)decodeRestorableStateWithCoder(_:) không được gọi super (như đề xuất trong accepted answer cho câu hỏi ở trên).

  3. cuối cùng, tôi có bộ điều khiển chế độ xem (chi tiết) xuất hiện, nhưng trạng thái của bản xem trước (nội dung nhãn văn bản và màu nền chính) ở trạng thái ban đầu, trống (không được khôi phục về trạng thái cuối cùng của chúng - tức là, nội dung nhãn văn bản và màu bg). Như đã đề cập trong this question, viewDidLoad() là không phải được gọi ngay sau decodeRestorableStateWithCoder(_:) (như tôi đã giả định), vì vậy thay vào đó, tôi gọi phương thức chung từ cả hai số viewDidLoad()decodeRestorableStateWithCoder(_:) để cập nhật giao diện người dùng.

Như thường lệ, tôi đổ xô đăng câu hỏi trước khi tìm kiếm hoặc thử đủ sửa đổi trong mã của tôi (xin lỗi ...).

Tôi hy vọng điều này ít nhất sẽ giúp người khác.

Như thường lệ, tôi sẽ đợi một vài ngày trước khi chấp nhận câu trả lời của riêng tôi, trong trường hợp ai đó làm sáng thêm.

Các vấn đề liên quan