我对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
属性而不会出现数据类型不匹配错误?
答案 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:
方法中,我们做了两件事:
在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 {...}