2

我对C4很陌生,所以请温柔...

如果我想将滑块值链接到标签,则可以使用 NSString stringWithFormat... 例如:

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

我还添加了一个步进器对象,现在它还更新了 mylabel:

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

但是,当我使用步进器时,如果滑块位置跟随标签值,那将是直观的。但.value不是UILabel...中的可用属性,那么我如何获取该mylabel.text属性并将其推送到该slider.value属性中而不会出现数据类型不匹配错误?

4

1 回答 1

1

这个问题有 2 个答案,如何使用 C4 对象以及如何使用 Interface Builder / UIControls 来完成。我将展示两种方式,首先是 UI,以便之后我可以比较 C4 方式。

用户界面控件


要使用 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:到滑块,也使用该选项将动作链接到步进器。您可以通过从项目中选择然后右键单击黄色立方体,然后从弹出菜单中列出的操作拖动到您最近放置在画布上的每个对象来执行此步骤。valueChangedstepperWasUpdated:valueChangedC4Canvas.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我们确保两个 UI 对象的最小/最大值相同(以便我们可以保持它们匹配)。

stepperWasChanged:方法中我们做了两件事:

  1. 我们使用步进器的值来设置标签的文本
  2. 我们还使用步进器的值来设置滑块的值!

在该sliderWasChanged:方法中,我们执行相同的操作,更新步进器,但我们还对滑块的值进行舍入,使其逐步递增(只是为了保持整洁)。

C4控制


为了对 C4 对象做同样的事情,而不是原生 UI 对象,我们进行了一些不同的设置。首先,我们不向 中添加任何内容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 而不是 UI 前缀之外,大部分内容是相同的。此外,我们调用我们的方法-(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 对象而不是 UI 对象,例如:

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

代替

-(IBAction)sliderWasUpdated:(UISlider *)slider {...}
于 2013-05-20T19:21:17.543 回答