0

、 、および がUIViewファイルUILabelUISliderに配置されてUIVeiwControllerViewControllerます。また、デバッグ ツールとしてをプログラムで に追加しましたUILabelUIView

はい、他の接続と同じように接続できUILabelますが、この問題を解決したら、グラフ計算でこの値を渡します。この変数を my に渡すための提案は自由ですが、グローバル変数の作成は避けたいと思います。必要に応じて配置された値に値を渡していますが、実装ファイルのスライダー値を「参照」して値を送信しようとすると、値が送信されず、値がゼロになります。UIViewUILabelUIViewUISliderUILabelUIVeiwControllerGraphView.m

私は 2 日間、stackoverflow フォーラムを精査し、ドキュメントを確認し、本を読み直して自分の問題を理解しようとしましたが、多くのことを学びました (そして他の問題を修正しました) が、私はまだこれを理解していません. 私はそれがとても単純なものだと確信しており、私は自分自身を蹴るだろうと確信しています. 他のドキュメントへの参照を歓迎します (おそらく既に読んでいます) が、建設的なフィードバックと方向性も提供してください。私のコードは以下の通りです:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    NSString *viewControllerSliderValue;
}
- (NSString *) viewConrtollerSliderValue;

@property (weak, nonatomic) IBOutlet UILabel *sliderValueLabel;

@property (weak, nonatomic) IBOutlet UISlider *sliderValue;

- (IBAction)sliderChange:(UISlider *)sender;

@end

ViewController.m

#import "ViewController.h"
#import "GraphView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    float sliderVal = self.sliderValue.value;
    self.sliderValueLabel.text = [NSString stringWithFormat:@"%.1f",sliderVal];
    NSLog(@"viewDidLoad: sliderVal = %f", sliderVal);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)sliderChange:(UISlider *)sender
{
    float sliderVal = sender.value;
    self.sliderValueLabel.text = [NSString stringWithFormat:@"%.1f", sliderVal];
    NSLog(@"sliderChange: sliderVal = %f", sliderVal);

}

- (NSString *)viewConrtollerSliderValue
{
    float sliderVal = self.sliderValue.value;
    viewControllerSliderValue = [NSString stringWithFormat:@"%f",[self sliderValue].value];
    NSLog(@"sliderChange: sliderVal = %f", sliderVal);
    return viewControllerSliderValue;
}

@end

GraphView.h

#import <UIKit/UIKit.h>

@interface GraphView : UIView

@end

GraphView.m

#import "GraphView.h"
#import "ViewController.h"

@implementation GraphView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    ViewController *viewController = [[ViewController alloc] init];

    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 90, 140, 20)];
    NSLog(@"GraphView: drawRect: vierContrllerSliderValue = %@", [viewController viewConrtollerSliderValue]);
    myLabel.text = [viewController viewConrtollerSliderValue];
    myLabel.backgroundColor = [UIColor lightGrayColor];
    myLabel.textAlignment = NSTextAlignmentCenter;
    [self addSubview:myLabel];
}

@end
4

2 に答える 2

1

問題は、画面に表示されているものとは別の をGraphView呼び出すときに、新しいView Controllerを作成していることです。ViewController *viewController = [[ViewController alloc] init];その新しいコントローラーのスライダーは操作しているものではないため、値が変わることはありません。

追加の問題は、GraphViewを呼び出すたびに新しいラベルを追加していることですdrawRect:。このメソッドは、ビューを再描画する必要があるたびに呼び出されます。代わりに、メソッドのサブビューとしてラベルを追加し、-initWithFrame:それへの参照をインスタンス変数またはプロパティとして保持します。

GraphViewビュー コントローラについてまったく知らない方がよいでしょう。代わりに、GraphView表示する値を設定するセッター メソッドが必要です。コントローラーは、スライダーが変化するたびに更新するようにグラフ ビューに指示する必要があります。次のようになります。

@interface GraphView
@property (nonatomic) float graphValue;
@end

@implementation GraphView {
    UILabel *graphLabel;
}


- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        graphLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 90, 140, 20)];
        graphLabel.backgroundColor = [UIColor lightGrayColor];
        graphLabel.textAlignment = NSTextAlignmentCenter;
        [self addSubview:graphLabel];
    }
    return self;
}


- (void)setGraphValue:(float)theValue {
    _graphValue = theValue;
    graphLabel.text = [NSString stringWithFormat:@"%f", theValue]
}

// Note; no need for -drawRect, because it will all be drawn by the label, which is a subview.

@end
于 2013-05-21T04:49:12.603 に答える
0

あなたのコードで気づいたことがいくつかあります:

  • drawRect:メソッド内のすべてを で実行しないdrawRect:でください。画面上にピクセルを描画するためにのみ使用するdrawRect:必要があります (ベジエ パス、色などを使用)。は 1 秒間に何度も呼び出される可能性があるため、できるだけ高速であることが重要です。そのため、オブジェクトの作成とビュー階層の操作は絶対に行わないでください。でViewControllerを作成することは絶対にしないでください。drawRect:drawRect:

ビューの初期状態を設定する必要がある場合は、View Controller のviewDidLoadメソッドで行う必要があります。おそらく、xib で GraphView を作成し、View Controller へのアウトレット接続を作成する必要があります。これを行うには、xib に新しい UIView を追加し、以下に示すように、右側のサイドバーの ID インスペクターでクラスを編集します。initWithFrame:( View ControllerのビューのサブビューとしてGraphViewを使用および追加することで、GraphViewをプログラムで作成することもできます)

ここに画像の説明を入力

于 2013-05-21T04:54:50.380 に答える