Обобщение связей элементов пользовательского интерфейса в одном представлении iOS

#objective-c #ios #xcode #ipad #interface-builder

#objective-c #iOS #xcode #iPad #конструктор интерфейса

Вопрос:

Я создаю представление калькулятора, которое использует ползунки для установки значений текстового поля. У каждого текстового поля есть соответствующий ему ползунок. Код для обновления значений текстового поля выглядит следующим образом:

 - (void) updateAlphaTextField:(id)sender 
{
    int value = [alphaSlider value];

    NSString *stringValue = [NSString stringWithFormat:@"%d",value];

    [alphaTextField setText:stringValue];    
}
  

Однако у меня есть около 20 текстовых полей (и 20 соответствующих ползунков), в которых я хотел бы продемонстрировать это поведение, и я не хочу писать 20 из этих функций обновления.

Могу ли я написать функцию, которая могла бы просматривать все ползунки и обновлять соответствующее текстовое поле правильным значением? Если да, то как мне настроить мои IB-соединения, чтобы заставить его работать? (Для выполнения вышеупомянутой функции требовалось подключение 1 IB)

Или, что еще лучше, есть ли функция Cocoa Touch, которая позволила бы мне сделать это легко?

Ответ №1:

Поместите теги в свои UITextFields и UISliders . Например: UITextField 1, будет иметь tag 1 и UISlider 1, также будет иметь tag 1. Затем создайте коллекцию IBOutlet со всеми вашими UITextField файлами. Вы можете использовать это, чтобы помочь вам:

http://www.bobmccune.com/2011/01/31/using-ios-4s-iboutletcollection/

В вашей функции сделайте это:

 - (void) updateAlphaTextField:(id)sender 
{
    int value = [alphaSlider value];

    NSString *stringValue = [NSString stringWithFormat:@"%d",value];

    UISlider *senderSlider = (UISlider*)sender;

    for(UITextField *textField in textFieldCollection){
       if(textField.tag==senderSlider.tag){
           [textField setText:stringValue];   
       }
    }
  

}

Комментарии:

1. Я получаю сообщение об ошибке «тег свойства не найден для строгого идентификатора типа объекта», есть ли способ идентифицировать слайдер с помощью идентификатора?

2. Я на самом деле обошел проблему и исправил ваш ответ для дальнейшего использования.

Ответ №2:

Вы можете обрабатывать все изменения вашего пользовательского интерфейса в вашем контроллере представления. Чтобы сопоставить ползунок с определенным текстовым полем, задайте для обоих одно и то же tag свойство. Затем вы можете перечислить все свои текстовые поля и проверить, равно ли tag свойство.

 [mySlider1 addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
[mySlider2 addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
  

И в вашем sliderValueChanged: методе:

 for (UITextField *textField in allMyTextFields) {
    if (sender.tag == textField.tag) {
        [textField setText:[NSString stringWithFormat:@"%d", value]];
    }
}
  

Комментарии:

1. является ли allMyTextFields встроенной переменной или мне нужно ее определить? Я не настраивал представление программно.

2. На мой взгляд, лучший вариант — с коллекцией IBOutlet.

3. @AndrewBarinov Вы должны определить переменную самостоятельно. Я не знал о коллекции IBOutlet, о которой упоминает Jacky Boy, но мне это кажется хорошим.