2016-11-23 46 views
5

W tej chwili implementuję aplet NSTouchBar do mojej aplikacji na MacOS.Aktualizuj NSTouchBar w locie, aby programowo dodawać/usuwać elementy.

W tej chwili, jedyny pasek dotykowy, jaki mam, ma główny kontroler widoku jako delegata i mogę dodawać do niego elementy. Połów jest, potrzebuję niektóre z tych elementów, aby pojawiły się tylko wtedy, gdy pewien warunek jest spełniony (wiersz jest zaznaczony w tabeli).

Weź pod uwagę, że mam wartość boolowską, która wskazuje, czy przycisk powinien być widoczny. Jak mogę zaktualizować NSTouchBar w locie, aby pokazać/ukryć ten przycisk na wypadek, gdyby zmieniła się wartość boolowska? (Nie muszę tego przestrzegać, mogę po prostu wywołać aktualizację w innej, już zaimplementowanej metodzie).

To, co zrobiłem na razie, jest następujące: w touchBar(:makeItemForIdentifier), mam przełącznik dla wszystkich identyfikatorów, i pod odpowiednim numerem case, albo zwracam NSCustomTouchBarItem za pomocą przycisku, albo nil, jeśli moja wartość logiczna to false.

Próbowałem ponownie wywoływać makeTouchBar po wybraniu wiersza tabeli, ale nie aktualizuje widoczności przycisków, tak jakby touchBar(:makeItemForIdentifier) nie był ponownie wywoływany.

Dzięki!

+0

Czy próbowałeś ustawić właściwość isVisible elementu dotykowego? – Arjuna

+0

Ta właściwość jest tylko do odczytu. – MrMage

Odpowiedz

7

Cztery pomysły:

  1. Spróbuj zmienić dotykowy pasek na defaultItemIdentifiers do zestawu identyfikatorów elementów, które powinny być widoczne. Zauważ, że byłoby to problematyczne, gdyby użytkownik dostosował pasek dotykowy, ale myślę, że zamiana elementów na żądanie i dostosowanie paska dotykowego i tak nie pasuje do siebie. Ma to także tę zaletę, że nie musisz zwracać nic w touchBar(:makeItemForIdentifier:).
  2. Wywołanie makeTouchBar() spowoduje utworzenie nowej instancji NSTouchBar, ale nie spowoduje zmiany właściwości touchBar. Spróbuj czegoś podobnego

    viewController.touchBar = viewController.makeTouchBar() 
    

    lub

    viewController.touchBar = nil 
    
    1. Ustaw właściwość touchBar na NSTableRowView które powinny pokazać dodatkowe przedmioty, gdy wybrany, i upewnij się, że obejmują otherItemsProxy w twoim defaultItemIdentifiers. Ponieważ zawartość paska dotykowego składa się ze wszystkich elementów w łańcuchu respondera, może to obejmować właściwość wiersza tabeli (pod warunkiem, że może zostać pierwszą odpowiedzią).

    2. Czy jesteś pewien, że te pozycje powinny być ukryte, gdy wiersz nie jest wybrany? Zastanów się, czy nie wyłączyć ich (np. Ustawiając właściwość enabled dla przycisków, które zawierają, na false).

+1

Dzięki za szczegółową odpowiedź. Spróbuję różnych propozycji i zdam raport. Mogę już powiedzieć, że 4. nie jest najlepszą opcją dla mnie ze względu na geometryczne ograniczenia pręta (tj. Ograniczona liczba widocznych elementów dozwolonych). Mogę zminimalizować marnotrawstwo przestrzeni pod tym względem. – beeb

+0

Co możesz również zrobić, to zawsze mieć elementy na pasku, ale z bardzo niskim priorytetem widoczności. Gdy przedmioty stają się ważne, po prostu zwiększ ich priorytet widoczności. – MrMage

+0

Zgłaszanie z powrotem, aby z radością powiedzieć, że 2. załatwiło sprawę! W połączeniu ze zwracającym 'nil' w' touchBar (: makeItemForIdentifier:) ', gdy element powinien być ukryty. Inne rozwiązania również mogą działać. – beeb

3

Wystarczy unieważnić touchbar w kontrolerze widoku:

self.touchbar = nil

Delegat metoda makeTouchBar() będzie wtedy automatycznie nazwać. Za pomocą flag możesz łatwo wybrać ikony do wyświetlenia.

EDYCJA: to rozwiązanie zostało przetestowane i działa poprawnie.

+0

dziękuję za wejście, ale MrMage już tak powiedział w swojej odpowiedzi (punkt 2) – beeb

+0

Zmieniono moją odpowiedź, aby odzwierciedlić fakt, że została ona przetestowana. Pierwsza odpowiedź to pomysły. – vomi

+0

Dzięki! To zadziała dobrze, chyba że pasek dotykowy można dostosować. Nie sądzę, że istnieje tymczasowy elegancki sposób na czasowe ukrywanie elementów z paska, jeśli pasek jest konfigurowalny. Podgląd nie powiedzie się w menu dostosowywania, jeśli nie zwrócisz pozycji w 'touchBar (: makeItemForIdentifier:)' (możemy użyć parametru w tej metodzie, aby wiedzieć, czy powinniśmy zwrócić element dla rzeczywistego paska lub dostosowania podglądy menu) lub nie będziesz ich miał w menu dostosowywania, jeśli nie dodasz ich do 'makeTouchBar()'. Jest to jednak problem z systemem MacOS. – beeb