2016-10-04 17 views
9

W 10.12 jest kilka ogromnych zmian, ale moim zdaniem największy jest nowy układ automatyczny (lub zmodyfikowany/przepisany stary ... kto wie). Przygotowałem prosty projekt, aby zademonstrować problem. Jest to związane ze zwijaniem elementu widoku podzielonego za pomocą przycisku. Zdarza się tylko 10.12. Wszystko, co musisz zrobić, to skompilować projekt i kliknąć przycisk. Zostanie wyświetlony błąd:Problemy z układem automatycznym macOS 10.12

2016-10-04 15: 10: 28.284296 test-12 [64932: 7425277] [Układ] Wykryto brakujące ograniczenia dla. Nie można go umieścić, ponieważ nie ma wystarczających ograniczeń, aby w pełni zdefiniować rozmiar i pochodzenie. Dodaj brakujące więzy lub ustaw translatesAutoresizingMaskIntoConstraints = YES i zostaną wygenerowane więzy dla ciebie. Jeśli widok ten jest układany ręcznie w systemie MacOS 10.12 i nowszych wersjach, możesz nie wywoływać [super układu] z nadpisania. Ustaw punkt przerwania na DETECTED_MISSING_CONSTRAINTS, aby debugować. Ten błąd zostanie zarejestrowany tylko raz.

Po ustawieniu punktu przerwania możemy dowiedzieć się, że widok jest problematyczne:

(lldb) po $arg1 
<NSSplitDividerView: 0x618000161980> 

Am I całkowicie błędne lub jest określony problem z 10.12? I proszę doradzić, jak zapobiegać tego typu błędom, jeśli to możliwe.

Projekt można pobrać z github

Jeszcze raz dziękuję za pomoc.

I. Nikolov

+2

Mogę uruchomić ten komunikat, po prostu dzwoniąc do NSAlert.layout(), aby wymusić natychmiastowe zgłoszenie się alertu. Ponieważ żadna z sugestii nie działa w tym przypadku i nie ma oczywistego sposobu na uniknięcie błędu, zgłosiłem radar (rdar: // 28700495). – rsfinn

+4

Rozwiązuję ten problem, zwracając 'false' z' splitView (_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool' w moim 'NSSplitViewController'. – LShi

+0

@LShi: Dzięki miałem ten sam problem i to działało również dla mnie. – mschmidt

Odpowiedz

0

Mam ten sam problem auto-układ i znalazłem obejście dla mojego projektu. Po dodaniu podglądu z jego ograniczeniami wzywam okno do "układu". Niestety robię to po każdym wywołaniu "add", w przeciwnym razie system ponownie rzuci brzydką wiadomość. Działa to dla mnie i po prostu nazywam to podczas inicjacji.

// Left Split View 
    [self.scrollviewMain setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainLeft addSubview:self.scrollviewMain]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
    // Right Split View 
    [self.scrollviewDetails setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainRight addSubview:self.scrollviewDetails]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant-1]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
+0

Ale ... powinieneś zgodzić się, że to nie jest właściwy sposób na układ ... Jest zdecydowanie coś nie tak ... lub przynajmniej źle interpretowane. W każdym razie - dziękuję za informacje. Istnieje kilka takich obejść, które moim zdaniem nie są wydajne ani wyszukane. Miejmy nadzieję, że sytuacja się zmieni w przyszłości, a my zdobędziemy więcej informacji, jak zapobiegać takim sytuacjom. –

Powiązane problemy