Chcę dodać przycisk, który po naciśnięciu zablokuje razem dwa suwaki, tak aby wartości dla dwóch suwaków były zawsze takie same.

Mam na to rozwiązanie za pomocą kodu, ale zastanawiam się, czy istnieje sposób na zrobienie tego za pomocą samego konstruktora interfejsów.

Martwię się, że rozwiązanie oparte na kodzie, które jeden suwak może pozostawać w tyle za drugim w środowiskach o wysokim obciążeniu procesora.

1
charliehorse55 24 luty 2012, 08:20

2 odpowiedzi

Najlepsza odpowiedź

Nie, nie da się tego zrobić z samym Interface Builder.

Właściwie wszystko staje się w końcu kodem, o ile rozumiem, Interface Builder został zbudowany w celu skrócenia czasu programowania, niekoniecznie w celu poprawy wydajności. Znalazłem ten interesujący cytat na stronie Apple o NIBach:

Xcode działa w połączeniu z tymi platformami, aby pomóc Ci się połączyć elementy sterujące interfejsu użytkownika do obiektów w projekcie które reagują na te kontrole.

Biorąc to pod uwagę, wszystko stanie się kodem (na pewnym poziomie). Informacje o plikach NIB.

W czasie wykonywania te opisy są używane do odtwarzania obiektów i ich konfiguracji w aplikacji. Gdy ładujesz plik nib w czasie wykonywania, otrzymujesz dokładną replikę obiektów, które znajdowały się w dokumencie Xcode. Kod ładujący nib tworzy instancje obiektów, konfiguruje je i ponownie ustanawia wszelkie połączenia międzyobiektowe utworzone w pliku nib.

Jeśli naprawdę chciałbyś uniknąć takiego zachowania, prawdopodobnie najlepszym, co możesz zrobić, to stworzyć widżet od podstaw, ale to byłoby zupełnie inne pytanie.

Po prostu ciekaw, dlaczego nie chciałbyś użyć kodu?

3
El Developer 24 luty 2012, 08:39

Blokowanie dwóch suwaków razem w IB jest łatwe. I nigdy nie widziałem lagów. Zależność tego zamka od naciśnięcia przycisku to inna historia, którą trzeba by zrobić za pomocą kodu, ale nie byłoby to zbyt skomplikowane. Zakładając, że masz gniazda podłączone w IB i zadeklarowane w kontrolerze

-(IBAction)lockSliders:(id)sender {
    [slider1 setContinuous:YES];
    [slider1 takeIntegerValueFrom:slider2]; // or takeFloatValueFrom or takeDoubleValueFrom
    [slider2 setContinuous:YES];
    [slider2 takeIntegerValueFrom:slider1];
 }
2
dbrajkovic 24 luty 2012, 09:08