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.textslider.value

4

1 に答える 1

1

この質問には、C4 オブジェクトを使用して行う方法と、Interface Builder / UIControls を使用して行う方法の 2 つの回答があります。後で C4 の方法を比較できるように、最初に UI の両方の方法を示します。

UI コントロール


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;

次に、3 つのコンポーネントすべてをプロジェクトの 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:メソッドでは、次の 2 つのことを行います。

  1. ステッパーの値を使用して、ラベルのテキストを設定します
  2. また、ステッパーの値を使用してスライダーの値を設定します!

このsliderWasChanged:メソッドでは、ステッパーを更新して同じことを行いますが、スライダーの値も丸め、段階的に増加するようにします (物事を整理するためだけです)。

C4コントロール


ネイティブ UI オブジェクトの代わりに 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;

UIプレフィックスの代わりにC4を使用していることを除いて、これのほとんどは同じであることに注意してください。また、 Interface Builder を使用していないため、-(void)代わりにメソッドを呼び出します。-(IBAction)

次に、次のコードを に追加します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

違い


2 つのアプローチの主な違いは、Interface Builder を使用するかどうかです。C4 アプローチではcreateAddObjects、スライダー、ラベル、ステッパーがすべてキャンバスに追加されるように、プロジェクトに呼び出されるメソッドを追加する必要があります。

このメソッドには、C4UIElements のアクションをコードにバインドするためのメソッドも含まれています。これは次の行で行われます。

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

これらが設定されると、次のような UI オブジェクトの代わりに C4 オブジェクトの使用を指定することだけが異なります。

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

それ以外の

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