2012-02-01 5 views
0

私はobjective-cプログラミングを初めて学びました。 私はviewcontrollerのヘッダーファイルに、私のviewcontrollerとfloat変数にuisliderを持っています。 私は2番目のビューの外観を変更する新しいクラスを持っています。私はdrawRectを上書きしました。ViewControllerから浮動小数点数をいくつかのクラスに渡す

私は単にslider.valueの値をとり、それを私のfloat変数に保存します。次に、この変数は描画する線の幅を定義するため、私のクラスでfloat変数にアクセスしようとします。私のビューコントローラの

ヘッダファイル

@interface ViewController : UIViewController 
{ 
float lineWidth; 
} 

@property float lineWidth; 
-(float)changingline; 
@end 

viecontroller.m // sliderForLine = UISlider

- (IBAction)valuechangedForLine:(UISlider *)sender 
{ 

float sliderValue = sliderForLine.value; 
lineWidth = sliderValue; 
[self changingline]; 

} 
-(float)changingline 
{ 
NSLog(@"%f", lineWidth); 

return lineWidth; 
} 

のNSLogは、どのように秒を指定する線幅いくつかの値

クラスがあると言いますUIViewは次のようになります

#import "ViewController.h" 

ViewController *oldView = [[ViewController alloc] init]; 
CGContextSetLineWidth(ctx, oldView.lineWidth); 
NSLog(@"%f",oldView.lineWidth); 

と私が使用している理由はここに、第二のクラスでは、のNSLogは、私は混乱している常に0

を言う、私は今も知らない - (ボイド)チェンジ:)

私が知っているすべてのクラス間で値を渡す方法を主なポイントにしていないということです。誰かが私が間違っていることを説明することができますか?事前に

ありがとう:]

+0

浮動小数点値をあるクラスから別のクラスに渡す方法について詳しく説明してください。あなたの設定を理解できないようです。 –

+0

まったく新しい 'ViewController'オブジェクトを作成していますので、float値は一度もインスタンスに設定されていません。既存のView Controllerへの参照を保持するか、プロトコルとそれぞれのメソッドを作成して、その値をデリゲートに渡す必要があります。 – Rog

答えて

1

あなたのNEED(たくない)、このためのデリゲート。そして、あなたがする必要があるすべてはこれら<一対のプロトコルに準拠している

私のビューコントローラ

@protocol ViewControllerDelegate <NSObject> 

@required 

-(void)valueChanged:(float)value; 

@end 

@interface ViewController : UIViewController 
{ 
float lineWidth; 
id<ViewControllerDelegate> _delegate; 
} 

@property float lineWidth; 
@property (nonatomic, assign) id<ViewControllerDelegate> delegate; 
-(float)changingline; 
@end 

//.m

@synthesize delegate = _delegate; 
... 

- (IBAction)valuechangedForLine:(UISlider *)sender 
{ 

float sliderValue = sliderForLine.value; 
lineWidth = sliderValue; 
[self.delegate valueChanged:lineWidth]; 

} 

ヘッダファイル:このような何かを試してみてください>必要なメソッドを実装します。あなたの質問に

また、(_lineWidthを使用し、代わりにlineWidthの、そう)アンダースコアであなたのIVARの名前を変更し、その後@synthesize lineWidth = _lineWidth

+0

'//.h の#import "firstViewController.h" @interfaceのSecondView:UIViewの {フロートライン。 } @property float line; //.m #import "firstViewController.h" @synthesize line; - (void)valueChanged:(float)value { line = value; } - (void)drawRect:(CGRect)rect { CGContextSetLineWidth(ctx、line); NSLog(@ "%f"、行); } ' nslogには0が表示されますが、私はfirstViewControllerを変更しましたが、まだ動作していないようです。なぜiVarsにアンダースコアを使用する必要がありますか?私は目的 - cで始まっているプロトコルが何であるかを調べなければならなかったので、私は答えなかった。 – repoguy

+0

フォーマットにごめんね – repoguy

+0

追加[表示setNeedsDisplay];あなたのvaluechangedメソッドで。 – CodaFi

0

、あなたはのUIViewControllerをサブクラスクラスViewControllerを記述する。インターフェイス(.h)を表示し、実装(.m)から2つのメソッドを表示します。クラスの新しいオブジェクト(oldView)が割り当てられ、初期化されるコードを表示します。ただし、新しいクラスオブジェクトの初期化方法(initメソッドを表示しない)は表示されません。

lineWidthは、オブジェクトoldViewの財産であり、これらの行にoldViewを初期化した直後に、あなたはそれを参照してください。

ViewController *oldView = [[ViewController alloc] init]; 
CGContextSetLineWidth(ctx, oldView.lineWidth); 
NSLog(@"%f",oldView.lineWidth); 

しかし、どこにもあなたは線幅の値が初期化されている場所を示していないでください。あなたはそれを初期化していないかもしれません。たぶん- (IBAction)valuechangedForLine:(UISlider *)senderが呼び出されなかった可能性があります。それはあなたの問題だろうか?

関連する問題