2010-08-13 12 views
7

Trong giao diện ứng dụng iOS của tôi, tôi hoàn tác hoàn tác & nút làm lại (lắc để hoàn tác là hành động khá nặng và trong ngữ cảnh này, các lần hoàn tác được thực hiện thường xuyên). Thông thường, tôi sẽ sử dụng KVO để quan sát các đường dẫn chính của canUndo và canRedo của NSUndoManager và cho phép vô hiệu hóa các nút khi thông báo xuất hiện. Thật không may, NSUndoManager dường như không tuân thủ KVO cho các đường dẫn chính đó - hoặc ít nhất, tôi ' m không thấy bất cứ điều gì về thông báo.NSUndoManager và bật/tắt nút hoàn tác

Vì vậy, câu hỏi của tôi là: Làm cách nào để làm việc này? Tôi chỉ làm sai với KVO? (Tôi đã tăng gấp đôi & ba lần kiểm tra nhưng luôn có khả năng đó). Có cách nào khác để làm điều này mà tôi không nghĩ đến? (Tôi đã mặc dù chỉ cần kiểm tra giá trị của -canUndo mỗi khi runloop quay nhưng đó là loại một mùi mã xấu với tôi).

(Lưu ý rằng nó khá có thể là NSUndoManager là khác nhau trên iOS và Mac OS X, vì vậy tôi không nghĩ rằng "Nó hoạt động trên Mac" sẽ là một câu trả lời hữu ích, trong trường hợp này)

Trả lời

12

Đăng ký NSUndoManagerDidUndoChangeNotification của NSUndoManager và bạn bè của bạn để kiểm tra khi các nhóm hoàn tác mới được tạo và bật ra khỏi ngăn xếp và cập nhật trạng thái của nút một cách thích hợp.

+3

Tuyệt vời - NSUndoManagerWillCloseUndoGroupNotification là cái tôi đã bỏ lỡ trước đó. Tất cả mọi thứ có ý nghĩa bây giờ. Cảm ơn @aclark. –

+1

Lần theo dõi cuối cùng: Tất cả đều hoạt động hoàn hảo. –

+0

Tài liệu nói: "Được đăng trước một đối tượng' NSUndoManager' đóng một nhóm hoàn tác, xuất hiện trong việc thực hiện phương thức 'endUndoGrouping'." Tuy nhiên, tôi có thể xác nhận rằng nó được đăng khi bạn đăng ký một lần hoàn tác đơn lẻ (ví dụ: với '-registerUndoWithTarget: selector: object:'). Rất hữu ích khi gọi 'canUndo' trên' notification.object' ('NSUndoManager') và bật/tắt bất kỳ nút" hoàn tác "nào trong giao diện người dùng. –