3 Stimmen

Reihenfolge, in der Beschriftungen und Textfelder zu Outlet-Sammlungen in Objective C hinzugefügt werden

Ich versuche, ein einfaches Übersetzungsprogramm für das iPhone zu erstellen und habe 5 Beschriftungen und 5 Textfelder mit Interface Builder in Xcode gezeichnet. Ich habe die Fragen zu einer Ausgangssammlung von UILabels und die Antworten zu einer Ausgangssammlung von UITextView hinzugefügt. Dieser Teil funktioniert alles großartig, ich kann die Sammlungen aufzählen und die Liste der Beschriftungen und Antworten zurückbekommen. Mein Problem ist, dass das, was ich hoffte, ich würde erhalten ist:

Index Frage # Antwort # 1 1 1 2 2 2 3 3 3 usw. in einer geordneten Reihenfolge, stattdessen erhalte ich:

1 1 2 2 3 1 3 2 3 usw. und es ist jedes Mal anders, wenn ich eine Bearbeitung vornehme und das Programm neu kompiliere. Wie synchronisiere ich eine Liste von Beschriftungen mit Textansichten in einer Ausgangssammlung, damit ich sie durchgehen kann, um zu überprüfen, ob die richtige Antwort für die Frage gegeben wurde?

9voto

rob mayoff Punkte 356759

Es gibt einige Möglichkeiten, wie Sie Ihre Beschriftungen und Ihre Textansichten aufeinander abstimmen können. Eine einfache Möglichkeit ist die Verwendung von Tags.

Alle UIView hat eine ganze Zahl tag Eigenschaft, die Sie nach Belieben verwenden können. Sie können das Tag im Code oder im Abschnitt "Ansicht" des Attribute-Inspektors in Ihrer Schreibfeder festlegen. Sie können eine Ansicht auch auffordern, alle ihre Nachfahren (einschließlich sich selbst) nach einer Ansicht mit einem bestimmten Tag zu durchsuchen, indem Sie die viewWithTag: Methode, aber die werden wir nicht verwenden.

So gehen Sie vor. Geben Sie in Ihrer Feder jedem Etikett eine andere Markierung. Nehmen wir an, Sie geben dem Etikett A die Markierung 1, dem Etikett B die Markierung 2, und so weiter. Geben Sie jeder Textansicht das gleiche Tag wie dem entsprechenden Label. Die Textansicht, die zu Label A gehört, erhält also Tag 1, und die Textansicht, die zu Label B gehört, erhält Tag 2 usw.

Dann, in Ihrem viewDidLoad Methode können Sie die Auslasssammlungen einfach nach Tag sortieren. Nehmen wir an, die Etiketten befinden sich in einer Ausgangssammlung namens labels und die Textansichten befinden sich in einer Ausgangssammlung namens textViews . So sortieren Sie sie:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSComparator compareTags = ^(id a, id b) {
        NSInteger aTag = [a tag];
        NSInteger bTag = [b tag];
        return aTag < bTag ? NSOrderedDescending
            : aTag > bTag ? NSOrderedAscending
            : NSOrderedSame;
    };
    self.labels = [self.labels sortedArrayUsingComparator:compareTags];
    self.textViews = [self.textViews sortedArrayUsingComparator:compareTags];
}

Jetzt ist die labels textViews Array aufeinander abgestimmt sind, so dass das Etikett bei Index 0 von labels geht mit der Textansicht bei Index 0 von textViews , und so weiter.

0voto

Nun, wenn ich versuche, mit IBOutletCollection. Ich habe festgestellt, dass die Reihenfolge der Elemente in Sammlungen durch die Reihenfolge, in der Sie das IBOutet-Element mit der Sammlung verknüpfen, geordnet ist.

0voto

Andrew Berg Punkte 1

Dieselbe Antwort wie oben, nur aktualisiert für Swift 3 Syntax:

let comparator: ((UIView, UIView) -> Bool) = {
  (left: UIView, right: UIView) in
  return left.tag < right.tag
}
labels.sort(by: comparator)
textViews.sort(by: comparator)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X