这是我正在编写的程序(我自己而不是复制别人的,因此不学习)作为 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;
}