Связывание степпера с UIObject слайдера в C4

Я очень новичок в C4, поэтому, пожалуйста, будьте осторожны...

Если я хочу связать значение ползунка с меткой, это делается с помощью NSString stringWithFormat... например:

self.mylabel.text = [NSString stringWithFormat:@"%4.2f",slider.value];

Я также добавил объект stepper, и теперь он также обновляет mylabel:

self.mylabel.text = [NSString stringWithFormat:@"%4.2f",stepper.value];

Но было бы интуитивно понятно, если бы положение ползунка соответствовало значению метки, когда я использую степпер. но .value не является доступным свойством в UILabel... так как же взять свойство mylabel.text и вставить его в свойство slider.value, не получая ошибки несоответствия типа данных?


person Les Nyulak    schedule 20.05.2013    source источник


Ответы (1)


На этот вопрос есть 2 ответа: как это сделать с помощью объектов C4 и как это сделать с помощью Interface Builder/UIControls. Я покажу оба способа, сначала пользовательский интерфейс, чтобы потом сравнить способ C4.

UIControl


Чтобы сделать это с помощью UIControls, сначала настройте заголовок C4WorkSpace.h, чтобы он имел следующие методы и свойства:

@property (assign, nonatomic) IBOutlet UILabel *myLabel;
@property (assign, nonatomic) IBOutlet UISlider *mySlider;
@property (assign, nonatomic) IBOutlet UIStepper *myStepper;

-(IBAction)sliderWasUpdated:(UISlider *)slider;
-(IBAction)stepperWasUpdated:(UIStepper *)stepper;

Затем перетащите все три компонента в файл XIB вашего проекта (например, UISlider, UILabel и UIStepper). Свяжите действие sliderWasUpdated: с ползунком с помощью параметра valueChanged, а действие stepperWasUpdated: со степпером также с помощью параметра valueChanged. Вы делаете этот шаг, выбирая C4Canvas.xib из своего проекта, затем щелкая правой кнопкой мыши желтый куб, а затем перетаскивая действия, перечисленные во всплывающем меню, на каждый из объектов, которые вы недавно разместили на холсте.

Затем добавьте следующий код в файл C4WorkSpace.m:

@implementation C4WorkSpace

-(void)setup {
    self.myStepper.minimumValue = 0.0f;
    self.myStepper.maximumValue = 10.0f;

    self.mySlider.minimumValue = 0.0f;
    self.mySlider.maximumValue = 10.0f;
}

-(IBAction)sliderWasUpdated:(UISlider *)slider {
    slider.value = [C4Math round:slider.value];
    self.myLabel.text = [NSString stringWithFormat:@"%4.2f",slider.value];
    self.myStepper.value = slider.value;
    [self.myLabel sizeToFit];
}

-(IBAction)stepperWasUpdated:(UIStepper *)stepper {
    self.myLabel.text = [NSString stringWithFormat:@"%4.2f",stepper.value];
    self.mySlider.value = stepper.value;
    [self.myLabel sizeToFit];
}

@end

В setup мы удостоверяемся, что минимальные/максимальные значения обоих объектов пользовательского интерфейса одинаковы (чтобы мы могли поддерживать их соответствие).

В методе stepperWasChanged: мы делаем две вещи:

  1. Мы используем значение степпера для установки текста метки.
  2. Мы также используем значение степпера для установки значения ползунка!

В методе sliderWasChanged: мы делаем то же самое, обновляя степпер, но также округляем значение ползунка, чтобы оно увеличивалось пошагово (просто для аккуратности).

C4Control


Чтобы сделать то же самое с объектами C4, вместо нативных объектов пользовательского интерфейса мы настраиваем все немного по-другому. Во-первых, мы ничего не добавляем к нашему C4Canvas.xib, вместо этого мы настроим объекты вручную.

В файле C4WorkSpace.h добавьте следующие строки кода:

@property (readwrite, nonatomic, strong) C4Label *myLabel;
@property (readwrite, nonatomic, strong) C4Slider *mySlider;
@property (readwrite, nonatomic, strong) C4Stepper *myStepper;

-(void)sliderWasUpdated:(C4Slider *)slider;
-(void)stepperWasUpdated:(C4Stepper *)stepper;

Обратите внимание, что в основном это то же самое, за исключением того, что мы используем C4 вместо префиксов пользовательского интерфейса. Кроме того, мы называем наши методы -(void) вместо -(IBAction), потому что мы не используем Interface Builder.

Затем добавьте следующий код в свой C4WorkSpace.m:

@implementation C4WorkSpace

-(void)setup {
    [self createAddObjects];
    //calibrate the min/max values
    self.myStepper.minimumValue = 0.0f;
    self.myStepper.maximumValue = 10.0f;

    self.mySlider.minimumValue = 0.0f;
    self.mySlider.maximumValue = 10.0f;
}

-(void)sliderWasUpdated:(C4Slider *)slider {
    slider.value = [C4Math round:slider.value];
    self.myLabel.text = [NSString stringWithFormat:@"%4.2f",slider.value];
    self.myStepper.value = slider.value;
    [self.myLabel sizeToFit];
}

-(void)stepperWasUpdated:(C4Stepper *)stepper {
    self.myLabel.text = [NSString stringWithFormat:@"%4.2f",stepper.value];
    self.mySlider.value = stepper.value;
    [self.myLabel sizeToFit];
}

-(void)createAddObjects {
    //set up the objects
    self.myLabel = [C4Label labelWithText:@"values"];
    self.myStepper = [C4Stepper stepper];
    self.mySlider = [C4Slider slider:CGRectMake(0, 0, 192, 44)];

    //position them
    CGPoint centerPoint = CGPointMake(self.canvas.center.x,
                                      self.canvas.center.y - 100);
    self.myStepper.center = centerPoint;

    centerPoint.y += 100;
    self.myLabel.center = self.canvas.center;

    centerPoint.y += 100;
    self.mySlider.center = centerPoint;

    //set up action bindings
    [self.mySlider runMethod:@"sliderWasUpdated:"
                      target:self
                    forEvent:VALUECHANGED];
    [self.myStepper runMethod:@"stepperWasUpdated:"
                       target:self
                     forEvent:VALUECHANGED];

    [self.canvas addObjects:@[self.myStepper,self.myLabel,self.mySlider]];
}

@end

РАЗЛИЧИЯ


Основное различие между этими двумя подходами заключается в том, используете ли вы Interface Builder или нет. В подходе C4 нам нужно добавить в наш проект метод с именем createAddObjects, чтобы наш ползунок, метка и степпер были добавлены на холст.

Этот метод также содержит методы для привязки действий наших C4UIElements к нашему коду, что происходит в строках:

[self.mySlider runMethod:@"sliderWasUpdated:"
                  target:self
                forEvent:VALUECHANGED];
[self.myStepper runMethod:@"stepperWasUpdated:"
                   target:self
                 forEvent:VALUECHANGED];

После их настройки единственное различие заключается в указании использования объектов C4 вместо объектов пользовательского интерфейса, например:

-(void)sliderWasUpdated:(C4Slider *)slider {...}

вместо

-(IBAction)sliderWasUpdated:(UISlider *)slider {...}
person C4 - Travis    schedule 20.05.2013
comment
P.S. Вот ссылка на суть с кодом для подхода C4: gist.github.com/C4Code/5614798< /а> - person C4 - Travis; 20.05.2013
comment
Я думаю, что тяготею к UI Builder, потому что в своей работе я разрабатываю сенсорные экраны, основанные на графическом интерфейсе Drag 'n' Drop, которые обычно просто связаны с контроллером (ПЛК) через адрес регистра в контроллер. Обычно я пишу код только для сценариев очень сложных действий, которые не используются в пользовательском интерфейсе из коробки... например, разбор текстового файла и извлечение определенных фрагментов данных или изменение способа работы экранного элемента. Если вы погуглите такой продукт, как Wonderware или RSView, вы поймете, о чем я говорю. - person Les Nyulak; 21.05.2013
comment
Это немного сложнее, потому что мне нужно вернуться к моему обучению Visual Basic и C, чтобы вспомнить, как работают такие базовые вещи, как объявление глобальной переменной! Тем не менее, C4 позволяет довольно легко кодировать очень сложные вещи на iOS, так что мне это очень нравится! - person Les Nyulak; 21.05.2013
comment
Ах да, тогда вы хотите изучить Interface Builder. Я с нетерпением жду создания IB-элементов для объектов C4, чтобы вы могли сами перетаскивать их на холст. Хотя это может занять некоторое время... Много планов и всего 10 пальцев, чтобы все это произошло в данный момент. - person C4 - Travis; 21.05.2013