Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order in which Labels and Text Fields are added to Outlet Collections in Objective C

Tags:

ios5

I am trying to create a simple translation program for iPhone and have drawn 5 labels and 5 text fields using Interface Builder in xcode. I have added the questions to an outlet collection of UILabels and the answers to an outlet collection of UITextView. This part all works great, i can enumerate the collections and get back the list of labels and answers. My problem is that what I was hoping I would get is:

Index Question # Answer # 1 1 1 2 2 2 3 3 3 etc. in an ordered sequence, instead I get:

1 1 2 2 3 1 3 2 3 etc. and its different every time I make an edit and recompile the program. How do I synch up a list of labels with text views in an outlet collection(s) so I can enumerate through them to check the right answer was provided for the question?

like image 212
fil Avatar asked Dec 31 '25 16:12

fil


1 Answers

There are a few ways you could match up your labels and your text views. One easy way is using tags.

Every UIView has an integer tag property that you can use however you wish. You can set the tag in code, or in the View section of the Attributes inspector in your nib. You can also ask a view to search all its descendants (including itself) for a view with a particular tag, using the viewWithTag: method, but we won't use that.

Here's what you do. In your nib, give each label a different tag. Let's say you give label A a tag of 1, and label B a tag of 2, and so on. Give each text view the same tag as the corresponding label. So the text view that goes with label A also gets tag 1, and the text view that goes with label B also gets tag 2, and so on.

Then, in your viewDidLoad method, you can just sort the outlet collections by tag. Let's say the labels are in an outlet collection named labels and the text views are in an outlet collection named textViews. Here's how you sort them:

- (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];
}

Now the labels array and the textViews array are matched up, so that the label at index 0 of labels goes with the text view at index 0 of textViews, and so on.

like image 122
rob mayoff Avatar answered Jan 02 '26 15:01

rob mayoff



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!