将步进器链接到C4中的Slider UIObject

时间:2013-05-20 03:59:29

标签: uislider uistepper c4

我对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属性而不会出现数据类型不匹配错误?

1 个答案:

答案 0 :(得分:1)

这个问题有两个答案,如何使用C4对象以及如何使用Interface Builder / UIControls来完成。我将首先展示两种方式,UI,以便我可以比较之后的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中,我们确保两个UI对象的最小值/最大值相同(以便我们可以保持它们匹配)。

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

  1. 我们使用stepper的值来设置标签的文本
  2. 我们还使用步进器的值来设置滑块的值!
  3. sliderWasChanged:方法中,我们做同样的事情,更新步进器,但我们也舍入滑块的值,使其逐步递增(只是为了保持整洁)。

    <强> C4Control


    为了对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 {...}