2017-08-28 35 views
7

Użyłem Xcode9 Beta6 do zbudowania projektu, akcja została poprawnie nazwana na urządzeniu iOS10, jednak nie działa na urządzeniu iOS11.Działanie iOS11 UIBarButtonItem nie zostanie wywołane

W moim projekcie istnieje kilka widokówController ma UIToolBar na górze, a toolBar zawiera niektóre elementy UIBarButtonItems.

Istnieje jeden tego rodzaju viewController, którego akcja UIBarButtonItem nie jest wywoływana, gdy stukam w UIBarButtonItem. Widzę animację stukania (ikona staje się najpierw przyciemniona i powraca do normalnego po zwolnieniu palca)

Na końcu viewDidLoad drukuję informacje o toolbar.items, aby wskazać, że akcja docelowa jest ustawiona prawidłowo.

Debug Output

+2

Kan Chen, rozwiązałeś problem? – Cata

+1

Czy posiadasz czytniki gestów w swoim kontrolerze ViewController? To spowodowało problem w moim przypadku. Nadal nie wiem, jak sobie z tym poradzić. –

+2

@AlexBlack Tak, mam. Dodaję TapGestureRecognizer w widoku 'view' viewControllera, a UIToolbar jest podglądem widoku' view' viewControllera. Ponieważ pasek narzędzi i jego barItem znajdują się na górze 'widoku', zdarzenie dotknięcia powinno zostać przechwycone przez barItem jako pierwsze. Zrobiłem już próbny projekt, aby zademonstrować to firmie Apple. Mam nadzieję, że dadzą mi odpowiedź, więc mogę napisać tutaj. –

Odpowiedz

3

I rozwiązać ten problem poprzez usunięcie bieżącego gest rozpoznawania z moim zdaniem i dodanie nowego. Następnie otworzyłem inspektora połączeń mojego widoku i dodałem połączenie gestRecognizer do mojego identyfikatora gestów.

1

Apple potwierdził ten błąd. Moje rozwiązanie tymczasowe zmienia obszar rozpoznawania gestów, usuwając obszar nakładania, aby gest tapowania nie blokował zdarzenia dotknięcia na UIBarButtonItem.

-2

Oznacz metodą, którą masz , kierując się na z adresem @objc.

+0

Ten problem nie dotyczy wyłącznie języka Swift. To faktycznie na iOS 11, czy jego Obj-C lub Swift. –

+0

@iOSCuriosity Na podstawie opisu PO dostarczyłem odpowiedź na tego rodzaju problem (ponieważ w Xcode 9 z nowym Swift powinieneś oznaczyć selektory itd. Za pomocą '@ objc', jeśli zarządzasz nim samemu). Nie musi ona jedynie wspomagać PO. –

0

Dzieje się tak tylko w systemie iOS 11 i niestandardowym UIView używanym do rightBarButtonItem (lub pozostawionym również). Jeśli używasz UIBarButtonItem, to będzie działać poprawnie. Jest 0 szerokości tego niestandardowego elementu paska, więc musimy go ustawić na coś.

W viewDidLoad tego kontrolera można dodać kod, można zastąpić 100 do czegoś, co będzie pracować dla Ciebie:

if let view = self.navigationItem.rightBarButtonItem?.customView { 
    view.widthAnchor.constraint(equalToConstant: 100).isActive = true 
} 

Przynajmniej tak proste rozwiązanie tymczasowe to jest w porządku.

0

W moim przypadku problem był gestureRecognizer dodany do całego widoku głównym (aby zamknąć klawiaturę) tak:

UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard)]; 
[self.view addGestureRecognizer:gesture]; 

To gest rozpoznawania nadpisuje kran na UIBarButtonItem, więc ja rozwiązany przez tworzenie nowego podglądu umieszczonego bezpośrednio pod paskiem nawigacji i przypisywanie go do tego widoku, a nie do całego widoku głównego.