Можно ли перебрать свойства одного класса, чтобы добавить их в NSMutableArray? - PullRequest
1 голос
/ 06 мая 2019

У меня есть 2 набора UIButton свойств (IBOutlet из основной раскадровки, которые находятся в пользовательском заголовочном файле подкласса View Controller).

В комплекте 5 кнопок. В нескольких методах моего View Controller мне нужен доступ к

В viewDidLoad у меня есть 2 NSMutableArray массивов для 2 комплектов. Я addobject:(*UIButton) пять раз за каждый комплект. В конце концов, это одна и та же строка кода, написанная 10 раз для каждой отдельной кнопки.

В нескольких методах моего View Controller мне нужен доступ к этим массивам. У меня есть массивы для того, чтобы сгенерировать индекс того, какая кнопка была нажата (индекс, который устанавливается в каждом методе нажатия кнопки IBAction). Вместо того, чтобы выписывать 5 методов для кнопок, я пишу один.

В viewDidLoad, есть ли отличный способ сконцентрировать 10 строк повторения в хороший цикл for, который может перечислять через каждую кнопку и добавлять эти данные в соответствующие NSMutableArray?

Или я просто все это записываю?

Кроме того, основываясь на том, что я описал, является ли этот подход плохим решением для доступа и изменения нескольких кнопок одного и того же класса и назначения?

В Main Storyboard я решил присвоить каждой кнопке значение тега (0-4). Первый набор: кнопка 1 (0), кнопка 2 (1) ... и т. Д. Второе: то же самое.

Это может работать только с методами взаимодействия кнопок (например, sender может использоваться для доступа к тегу.) В viewDidLoad такого взаимодействия пока не происходит.

Вот как это выглядит сейчас:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.dirBtns = [[NSMutableArray alloc] initWithCapacity:5];
    [self.dirBtns addObject:self.salineDirBtn];
    [self.dirBtns addObject:self.sampleDirBtn];
    [self.dirBtns addObject:self.airDirBtn];
    [self.dirBtns addObject:self.wasteDirBtn];
    [self.dirBtns addObject:self.lowlossDirBtn];

    self.runBtns = [[NSMutableArray alloc] initWithCapacity:5];
    [self.runBtns addObject:self.salineRunBtn];
    [self.runBtns addObject:self.sampleRunBtn];
    [self.runBtns addObject:self.airRunBtn];
    [self.runBtns addObject:self.wasteRunBtn];
    [self.runBtns addObject:self.lowlossRunBtn];

    // other stuff
}

1 Ответ

1 голос
/ 06 мая 2019

Два варианта:

  1. Вы можете использовать литералы массива:

    self.dirBtns = @[self.salineDirBtn, self.sampleDirBtn, self.airDirBtn, self.wasteDirBtn, self.lowlossDirBtn];
    self.runBtns = @[self.salineRunBtn, self.sampleRunBtn, self.airRunBtn, self.wasteRunBtn, self.lowlossRunBtn];
    

    Если вы сделаете это, вы можете сделать dirBtns и runBtnsNSArray вместо NSMutableArray.

  2. Вы можете использовать коллекции розеток (как описано в в этом ответе ), например:

    @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *dirBtns;
    @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *runBtns;
    

    hook up iboutletcollection

    Затем вы можете подключить свои кнопки к этим коллекциям розеток от IB без какого-либо кода.

ИтогЕсли порядок в массиве имеет значение, я бы предложил вариант 1, в противном случае я бы предложил вариант 2.

...