2009-03-11 6 views
4

Eine kurze Frage über die UISegmentedControl-Klasse auf dem iPhone.UISegmentedControl Verhalten

Hoffentlich haben einige bemerkt, wie in seinem Standardzustand mit 2 Segmenten das segmentierte Steuerelement immer noch umschalten wird, auch wenn der Benutzer auf ein Segment klickt, das gerade ausgewählt ist.

Ich habe UISegmentedControls in Apps gesehen, die dieses Verhalten negieren und nicht umschalten, wenn der Benutzer ein ausgewähltes Segment drückt. Nämlich Apples iTune Store App.

Gibt es eine einfache Möglichkeit, dieses Verhalten zu verhindern, das ich überblicke, oder muss ich etwas Logik in den ValueChanged schreiben?

Ich habe versucht, derzeit ausgewählte Segmente zu deaktivieren und nicht ausgewählte, aber das scheint das Aussehen des Steuerelements zu ändern, wenn ich es nicht tun möchte.

Irgendwelche Ideen?

Antwort

8

Suchen Sie in der UISegmentedControl.h Header-Datei (eine einfache Möglichkeit ist, doppelklicken Sie auf "UISegmentedControl" in XCode mit dem Befehl gedrückt gehalten).

Dort sehen Sie eine Reihe von Elementen in einem _segmentedControlFlags struct. Wenn Sie eine Kategorie in UISegmentedControl erstellen, können Sie eines dieser Elemente bearbeiten - einschließlich dontAlwaysToggleForTwoSegments, was, wie Sie vielleicht anhand des Namens vermuten, ist, was Sie suchen.

Da dies im API-Header (aber nicht in der eigentlichen Dokumentation) dokumentiert ist, sollte es ziemlich sicher zu verwenden sein.

+0

Dank! Genau das habe ich gesucht. Weißt du irgendeinen Grund, warum Apple dies nicht zu einer dokumentierten Eigenschaft macht? – Jasarien

+0

Nicht genau sicher, es ist interessant, dass es in der Kopfzeile und nicht in der Dokumentation ist, da Apple andere Sachen aus der Kopfzeile in anderen Klassen verlassen hat, wenn sie nicht verwendet werden wollte ... –

+3

Dies ist nicht dokumentiert API es ist Privatgelände. Der Grund dafür ist, dass der Simulator die Legacy-Laufzeit verwendet und die Ivar-Layouts konsistent sind. Deshalb funktionieren Apps, die gegen einen Build des Simulators kompiliert werden, nicht immer korrekt mit anderen Simulator-Builds. Wenn Sie dies tun, können Sie plötzlich brechen, wenn Apple das Layout der Klasse in zukünftigen OS-Versionen ändert. –

4

Dieses Standardverhalten wurde in der API 3.0 geändert.

4

In 3.0 "_segmentedControlFlags" wird auf die "momentane" Eigenschaft geändert worden, die noch in der Datei UISegmentedControl.h Header gefunden werden können.

1

Der Zugriff auf die _segmentedControlFlags über eine Kategorie wird als Verwendung einer privaten API und somit als Verletzung der Lizenzvereinbarung von Apple angesehen, wie ich heute erfahren musste. Bis jetzt dachte ich, Kategorien sind eine Spracheigenschaft, um jemand elses schreckliches Klassendesign zu reparieren ...

+0

Wenn es in der Kopfzeile verfügbar ist, ist es nicht privat. Die Verwendung privater APIs umfasst die Verknüpfung mit privaten Frameworks und das Ausgeben von Symbolinformationen, um eigene Header für diese Frameworks zu erstellen. – Jasarien

+1

Ich habe gestern eine E-Mail von Apple erhalten, die sich über den Zugriff auf _segmentedControlFlags beschwert hat und darauf verzichtet hat. – aldi