这个问题有 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:
到滑块,也使用该选项将动作链接到步进器。您可以通过从项目中选择然后右键单击黄色立方体,然后从弹出菜单中列出的操作拖动到您最近放置在画布上的每个对象来执行此步骤。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:
方法中,我们执行相同的操作,更新步进器,但我们还对滑块的值进行舍入,使其逐步递增(只是为了保持整洁)。
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 {...}