这是我正在编写的程序(我自己而不是复制别人的,因此不学习)作为 ObjectiveC 和 Cocoa 学习曲线的一部分。我想在 NSView 上绘制简单的形状(现在限制为椭圆和矩形)。这个想法是我将每个 NSBezierPath 记录到一个 NSMutableArray 中,这样我还可以调查/实现保存/加载、撤消/重做。我有一个画布,可以在上面画画,还有 2 个用于选择工具的按钮。为了处理路径,我创建了另一个对象,该对象可以保存每个绘制对象的 NSBezierPath、颜色值和大小值。这就是我要存储在数组中的内容。我使用 mouseDown/Dragged/Up 来获取绘图路径的坐标。然而,这就是事情变得不稳定的地方。我可以实例化应该保存路径/颜色/等的对象。info 但是,当我尝试更改实例变量时,应用程序崩溃,调试器中没有有用的消息。我会尽量缩短我的代码片段,但如果我需要包含更多,请告诉我。代码也因为我尝试了很多事情来使它工作而退化了一点。
项目:基于 Cocoa 文档的应用程序
我有以下 .m/.h 文件
MyDocument:NSDocument
- 由 XCode 生成DrawnObject:NSObject
- 处理绘制的对象,即路径、颜色、类型(椭圆/矩形)和大小Canvas:NSView
- 好吧,显示绘图,处理鼠标和按钮
Canvas 还负责维护NSMutableArray
对象DrawnObject
。
DrawnObject.h
看起来像这样:
#import <Foundation/Foundation.h>
//The drawn object must know what tool it was created with etc as this needs to be used for generating the drawing
@interface DrawnObject : NSObject {
NSBezierPath * aPath;
NSNumber * toolType;//0 for oval, 1 for rectangular etc....
float toolSize;
struct myCol{
float rd;
float grn;
float blu;
float alp;
} toolColor;
}
-(void)setAPath:(NSBezierPath *) path;
-(NSBezierPath *)aPath;
@property (readwrite,assign) NSNumber * toolType;
-(float)toolSize;
-(void)setToolSize:(float) size;
-(struct myCol *)toolColor;
-(void)setCurrentColor:(float)ref:(float)green:(float)blue:(float)alpha;
@end
Canvas.h
看起来像这样
#进口 #import "drawnObject.h" @界面画布:NSView { NSMutableArray * myDrawing; NSPoint 下点; NSPoint 当前点; NSBezierPath * viewPath;//显示用户拖动鼠标时的路径 NSNumber * 当前工具类型; BOOL mouseUpFlag;//尝试不同的方式使其工作 布尔鼠标拖动; } -(IBAction)useOval:(id)发件人; -(IBAction)useRect:(id)sender; -(IBAction)showTool:(id)sender; -(NSRect)当前矩形; -(NSBezierPath *)createPath:(NSRect) aRect; -(void)setCurrentToolType:(NSNumber *) t; -(NSNumber *)currentToolType; @结尾
在Canvas.m
文件中有几个函数来处理鼠标和 NSView/XCode 也放入了
,
-(id)initWithFrame:(NSRect)frame-(void)drawRect:(NSRect)rect
最初我mouseUp
用来尝试将新DrawnObject
的插入到数组中,但这导致了崩溃。所以,现在我使用两个BOOL
标志来查看鼠标何时被释放(笨拙但我正在尝试......)drawRect
插入到数组中。我已经包含了下面的方法,并指出了它导致应用程序失败的位置:
- (void)drawRect:(NSRect)rect { //这是自动调用的 // 这里绘制代码。 //NSLog(@"drawRect内工具类型为%d", [self currentTool]); NSRect 边界 = [自我边界]; NSRect aRect = [self currentRect]; viewPath = [self createPath:aRect]; //createPath 方法使用工具类型在椭圆和矩形贝塞尔曲线之间切换 if(mouseUpFlag==YES && mouseDrag==YES){ 鼠标拖动=否; //在这里新建一个drawedObject DrawnObject * anObject = [[DrawnObject alloc]init];//- 工作正常到这里 NSLog(@"创建新的 drawObject"); [anObject setAPath:viewPath]; //- 应用程序立即死亡!!!! NSLog(@"在drawedObject中设置路径"); [anObject setToolType:[[NSNumber alloc]initWithInt:5]]; NSLog(@"在 DrawnObject 中设置 toolType"); [anObject setToolType:currentToolType]; [myDrawing addObject:anObject]; NSLog(@"添加的对象"); } [[NSColor colorWithCalibratedRed:0.0 green:0.9 blue:0.0 alpha:0.5]set]; [NSBezierPath fillRect:bounds]; [[NSColor lightGrayColor]set]; [视图路径描边];//这是为了让用户可以看到正在绘制的位置 //现在,在数组中绘制路径 [[NSColor blueColor]set]; for(DrawnObject * indexedObject in myDrawing){ [[indexedObject aPath] stroke];//这将做所有对象的实际绘制 } }
我想这与对象范围或其他东西有关,但我就是想不通。正如我所说,当我尝试过一些事情时,代码已经发生了某种变化,遗憾的是不是更好。像那些 BOOLS 等。
帮助!任何聪明的人,请指出我正确的方向!
添加这个:
-(NSBezierPath *)createPath:(NSRect) aRect
{
NSBezierPath * tempPath;
//I need to know what tool
switch(0){ //temporary - this would use the toolType as a selector
case 0:
tempPath = [NSBezierPath bezierPathWithOvalInRect:aRect];
break;
case 1:
tempPath = [NSBezierPath bezierPathWithRect:aRect];
break;
default:
tempPath = [NSBezierPath bezierPathWithOvalInRect:aRect];
break;
}
return tempPath;
}