在C4

2013-05-20 52 views
2

鏈接步進到滑塊UIObject的我是很新的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

這個問題有2個答案,如何使用C4對象以及如何使用Interface Builder/UIControls來完成。我會先以兩種方式展示UI,以便我可以在之後比較C4方式。

UIControl


要與首次設置C4WorkSpace.h頭,這樣UIControls做到這一點,有以下方法和屬性:

然後,在你將所有三個組成部分到您的項目XIB文件(即UISlider,UILabel和UIStepper)。使用valueChanged選項將動作sliderWasUpdated:鏈接到滑塊,並使用valueChanged選項將stepperWasUpdated:動作鏈接到步進器。您可以通過從項目中選擇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,我們要確保這兩個用戶界面對象的最小/最大值是相同的(這樣我們就可以讓他們匹配了)。

stepperWasChanged:方法中,我們做兩件事情:

  1. 我們使用步進的值來設置標籤的文本
  2. 我們還使用步進的值來設置滑塊的值!

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; 

注意,大部分是相同的,除了我們正在使用的,而不是UI前綴C4。此外,我們調用我們的方法-(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 {...} 
+0

P.S.下面是C4方法代碼的要點鏈接:https://gist.github.com/C4Code/5614798 –

+0

乾杯特拉維斯! –

+0

我想我很喜歡UI Builder,因爲在我的工作中,我設計了基於圖形拖放界面的觸摸屏,這些界面通常通過寄存器的地址鏈接到控制器(PLC)控制器。通常我只編寫代碼來編寫非常複雜的操作,這些操作在用戶界面中沒有處理,即:解析文本文件並提取特定數據片段,或者更改屏幕上元素的工作方式。如果你谷歌的產品如「Wonderware」或「RSView」,你會看到我在說什麼。 –