0

ユーザーインターフェイスの既存のビューに棒グラフを描画したいと思います。シングルバーの高さは、ユーザー入力後に計算され、配列に格納されます。最後に棒グラフを描画するためにボタンをブッシュした後、配列をカスタムGraphViewクラスに渡す必要があります。しかし、それは機能しません。配列を正しく渡すかどうか(どうすれば確認できますか?)、drawrectメソッドで配列にアクセスしてシングルバーの高さを設定する方法がわかりません。NSNumber *balkenHoehe = [balkenArray objectAtIndex:i];drawrectメソッドを入力するとすぐにbalkenHoehe、rect-hightとしてエラーが発生します。私は何をしなければなりませんか?ありがとう!

これが私のコードです:

私のAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *eingabeNennmass;
@property (weak) IBOutlet NSTextField *eingabeToleranzOben;
@property (weak) IBOutlet NSTextField *eingabeToleranzUnten;
@property (weak) IBOutlet NSTextField *eingabeAnzahlWerte;
@property (weak) IBOutlet NSTextField *ausgabeMittelwert;
@property (weak) IBOutlet NSTextField *ausgabeToleranz
@property (weak, nonatomic) IBOutlet GraphView *ausgabeGraph;

- (IBAction)pushSimulation:(NSButton *)sender;

@end

私のAppDelegate.mは短縮されました

#import "GraphView.h" 
#import "AppDelegate.h"

implementation AppDelegate
....//couple calculating code and building the array klassenArray//...

    [klassenArray addObject:[NSNumber numberWithDouble: n]];
....//more code//...

[_ausgabeGraph setBalkenArray:klassenArray]; (connected with the GraphView view on the user interface)

....//more code//...

私のGraphView.h

#import <Cocoa/Cocoa.h>

@interface GraphView : NSView
{

NSMutableArray *balkenArray;

}

- (NSMutableArray *) balkenArray;
- (void) setBalkenArray:(NSMutableArray *)abalkenArray;

@end

私のGraphView.m

#import "GraphView.h"

@implementation GraphView

//*******************************
- (void) setBalkenArray:(NSMutableArray *)abalkenArray
{
    balkenArray = abalkenArray;
    [self setNeedsDisplay:YES];
}

//*******************************
- (NSMutableArray *)balkenArray
{
    return balkenArray;
}

//*******************************
- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }

    return self;
}

//*******************************
- (void)drawRect:(NSRect)dirtyRect
{

    NSRect bounds = [self bounds];
    float fieldWith = bounds.size.width / 12.0;
    float fieldHeight = bounds.size.height / 12.0;

        //background
    NSRect hintergrundRect =
    hintergrundRect = NSMakeRect(bounds.origin.x, bounds.origin.y,
                                  bounds.size.width, bounds.size.height);
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:hintergrundRect];

        //Diagram

    for (int i = 1; i<=10; i++) {
        NSNumber *balkenHoehe = [balkenArray objectAtIndex:i];
//        NSLog(@"rectnumber at index %d is %@", i, balkenHoehe);

        NSRect aRect =
        aRect = NSMakeRect (fieldWith*i, fieldHeight, fieldWith, balkenHoehe); //x, y, width, hight
        // draw rect
    [[NSColor whiteColor] set];
    [NSBezierPath fillRect:aRect];

        // draw border
    [[NSColor blackColor] set];
    NSBezierPath *aPath = [NSBezierPath bezierPathWithRect:aRect];
    [aPath setLineWidth:1];
    [aPath stroke];
    }
}


@end
4

1 に答える 1

0

わかりました、ここで私自身に感謝します!いいやつ。GrapView.hで@propertyと@systnesizeを使用しました

@interface GraphView : NSView
{
NSMutableArray *balkenArray;
}
@property(nonatomic, retain)NSMutableArray *balkenArray;
@property(readwrite, assign)double _maxKlasse;
@end

およびGraphView.m

@synthesize balkenArray, _maxKlasse;

AppDelegate.mでは、配列がビューに送信されます。

_ausgabeGraph.balkenArray=klassenArray;
_ausgabeGraph._maxKlasse=maxKlasse;
[_ausgabeGraph setNeedsDisplay:YES];

最後に、配列はGraphView.mで棒グラフを描画するために使用されます。

...コード..。

for (int i = 1; i<=10; i++) {
  double _x = [(NSNumber*)[balkenArray objectAtIndex:i-1] doubleValue];

  //draw rect
  NSRect aRect =
    aRect = NSMakeRect (fieldWith * i, fieldHeight, fieldWith, (6*fieldHeight*_x/_maxKlasse)); //x, y, width, variable hight
    [[NSColor whiteColor] set];
    [NSBezierPath fillRect:aRect];

...その他のコード..。

プロパティと合成を使用したヒントを提供してくれたGabrielePetronellaに感謝します。私が理解している限り、それははるかに使いやすいです。私はまだ命名の慣習を学ぶ必要があります。

于 2012-12-12T19:57:19.010 に答える