2016-11-23 12 views
5

Tôi hiện đang triển khai api NSTouchBar cho ứng dụng macOS của mình.Cập nhật NSTouchBar khi đang di chuyển để thêm/xóa các mục lập trình

Tại thời điểm này, thanh chạm duy nhất tôi có Trình điều khiển chế độ xem chính làm đại biểu và tôi có thể thêm các mục vào nó. Việc nắm bắt được, tôi cần một số các mục đó chỉ xuất hiện khi một điều kiện nhất định được đáp ứng (một hàng được chọn trong một bảng).

Hãy xem xét tôi có boolean cho biết nút có hiển thị hay không. Làm thế nào để cập nhật NSTouchBar khi đang bay để hiển thị/ẩn nút này trong trường hợp thay đổi boolean của tôi? (Tôi không cần phải quan sát boolean này, tôi chỉ đơn giản có thể thực hiện cuộc gọi để cập nhật trong một phương pháp tôi đã thực hiện)

Những gì tôi đã làm cho bây giờ là như sau: trong touchBar(:makeItemForIdentifier), tôi có một công tắc cho tất cả các định danh, và theo đúng số case, tôi trả lại NSCustomTouchBarItem bằng nút hoặc nil nếu boolean của tôi là false.

Tôi đã thử gọi lại makeTouchBar sau khi một hàng của bảng được chọn nhưng không cập nhật khả năng hiển thị của nút, như thể touchBar(:makeItemForIdentifier) không được gọi lại.

Cảm ơn!

+0

Bạn đã thử đặt thuộc tính có thể truy cập của mục cảm ứng chưa? – Arjuna

+0

Thuộc tính đó là chỉ đọc. – MrMage

Trả lời

7

Bốn ý tưởng:

  1. Hãy thử thay đổi thanh liên lạc của bạn của defaultItemIdentifiers với tập hợp các định danh mục mà sẽ được hiển thị. Lưu ý rằng điều này sẽ có vấn đề nếu người dùng đã tùy chỉnh thanh cảm ứng, nhưng tôi cho rằng việc hoán đổi các mục theo yêu cầu và tùy chỉnh thanh cảm ứng sẽ không hoạt động tốt với nhau. Điều này cũng có lợi thế là bạn không cần trả lại số không trong số touchBar(:makeItemForIdentifier:).
  2. Gọi makeTouchBar() sẽ tạo một phiên bản NSTouchBar mới, nhưng không thay đổi thuộc tính touchBar. Hãy thử một cái gì đó giống như

    viewController.touchBar = viewController.makeTouchBar() 
    

    hoặc

    viewController.touchBar = nil 
    
    1. Đặt touchBar tài sản trên NSTableRowView rằng nên hiển thị các mục thêm khi được chọn, và chắc chắn để bao gồm các otherItemsProxy trong số defaultItemIdentifiers của bạn. Vì nội dung của thanh cảm ứng bao gồm tất cả các phần tử trong chuỗi trả lời, điều này có thể bao gồm thuộc tính touchBar của hàng trong bảng (miễn là nó có thể trở thành đáp ứng đầu tiên).

    2. Bạn có chắc chắn rằng các mục này phải là ẩn khi hàng không được chọn? Thay vào đó, hãy xem xét tắt chúng (ví dụ: bằng cách đặt thuộc tính enabled của các nút mà chúng chứa thành false).

+1

Cảm ơn bạn đã trả lời chi tiết. Tôi sẽ thử các mệnh đề khác nhau và báo cáo lại. Tôi đã có thể nói rằng 4. không phải là lựa chọn tốt nhất cho tôi vì các ràng buộc hình học của thanh (tức là số lượng hạn chế các thành phần hiển thị được cho phép). Tôi có thể muốn giảm thiểu lãng phí không gian trong vấn đề đó. – beeb

+0

Những gì bạn cũng có thể làm là luôn có các mục trong thanh, nhưng với mức độ ưu tiên hiển thị rất thấp. Khi các mục trở nên quan trọng, chỉ cần tăng mức độ ưu tiên hiển thị của chúng. – MrMage

+0

Báo cáo lại để vui vẻ nói rằng 2. đã làm các trick! Kết hợp với việc trả về 'nil' trong' touchBar (: makeItemForIdentifier:) 'khi mục cần được ẩn. Các giải pháp khác có thể hoạt động tốt. – beeb

3

Chỉ cần vô hiệu hóa touchbar trong điều khiển điểm của bạn:

self.touchbar = nil

Phương pháp makeTouchBar() đại biểu sau đó sẽ tự động được gọi. Sử dụng cờ của bạn, bạn có thể dễ dàng chọn các biểu tượng xuất hiện.

EDIT: giải pháp này đã được kiểm tra và hoạt động tốt.

+0

cảm ơn cho đầu vào nhưng MrMage đã nói như vậy trong câu trả lời của mình (điểm 2) – beeb

+0

Đã chỉnh sửa câu trả lời của tôi để phản ánh thực tế là nó đã được thử nghiệm. Câu trả lời đầu tiên là ý tưởng. – vomi

+0

Cảm ơn! Điều này sẽ hoạt động tốt trừ khi thanh cảm ứng có thể tùy chỉnh. Tôi không nghĩ rằng có một cách thanh lịch để ẩn các mục từ thanh tạm thời nếu thanh có thể tùy chỉnh. Xem trước sẽ thất bại trong menu tùy chỉnh nếu bạn không trả về một mục trong 'touchBar (: makeItemForIdentifier:)' (chúng ta có thể sử dụng tham số trong phương thức này để biết liệu chúng ta có nên trả lại mục cho thanh thực hay tùy chỉnh không xem trước trình đơn) hoặc bạn sẽ không có chúng ở tất cả trong menu tùy chỉnh nếu bạn không bao gồm chúng trong 'makeTouchBar()'. Đây là một vấn đề macOS mặc dù. – beeb

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