#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, но мне это кажется хорошим.