Это программа, которую я пишу (я сам в отличие от копирования чужого и, следовательно, не учусь) как часть кривой обучения ObjectiveC и Cocoa. Я хочу нарисовать простые формы на NSView (ограничивая его овалами и прямоугольниками на данный момент). Идея состоит в том, что я записываю каждый NSBezierPath в NSMutableArray, чтобы я мог также исследовать / реализовать сохранение / загрузку, отменить / повторить. У меня есть холст, я могу нарисовать на нем, а также 2 кнопки, которые я использую для выбора инструмента. Для обработки пути я создал еще один объект, который может содержать NSBezierPath, значения цвета и значения размера для каждого нарисованного объекта. Это то, что я хочу хранить в массиве. Я использую mouseDown / Dragged / Up, чтобы получить координаты пути рисования. Тем не менее, это то, где дела идут плохо. Я могу создать экземпляр объекта, который должен содержать путь / цвет / и т. Д. информация, но, когда я пытаюсь изменить переменную экземпляра, приложение вылетает без полезного сообщения в отладчике. Я постараюсь сделать свои фрагменты кода короткими, но скажите, нужно ли мне добавить больше. Код также немного выродился из-за того, что я пытался заставить его работать так много вещей.
Проект: приложение на основе документов Какао
У меня есть следующие файлы .m / .h
MyDocument:NSDocument
- генерируется XCode
DrawnObject:NSObject
- имеет дело с нарисованным объектом, т.е. путем, цветом, типом (овал / прямоугольник) и размером
Canvas:NSView
- хорошо, показывает рисунок, имеет дело с мышью и кнопками
Canvas также отвечает за поддержание NSMutableArray
из DrawnObject
объектов.
DrawnObject.h
выглядит так:
</p>
<pre>
#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
</pre>
<p>
Canvas.h
выглядит так
#import
#import "drawnObject.h"
@interface Canvas : NSView {
NSMutableArray * myDrawing;
NSPoint downPoint;
NSPoint currentPoint;
NSBezierPath * viewPath;//to show the path as the user drags the mouse
NSNumber * currentToolType;
BOOL mouseUpFlag;//trying a diff way to make it work
BOOL mouseDrag;
}
-(IBAction)useOval:(id)sender;
-(IBAction)useRect:(id)sender;
-(IBAction)showTool:(id)sender;
-(NSRect)currentRect;
-(NSBezierPath *)createPath:(NSRect) aRect;
-(void)setCurrentToolType:(NSNumber *) t;
-(NSNumber *)currentToolType;
@end
В файле Canvas.m
есть несколько функций для работы с мышью, и NSView / XCode также был добавлен в <br />-(id)initWithFrame:(NSRect)frame
и -(void)drawRect:(NSRect)rect
Изначально я использую mouseUp
, чтобы попытаться вставить новый DrawnObject
в массив но это вызвало аварию. Итак, теперь я использую два BOOL
флага, чтобы увидеть, когда мышь была выпущена (неуклюже, но я пытаюсь ....) в drawRect
, чтобы вставить в массив. Я включил метод ниже и указал, где это вызывает сбой приложения:
- (void)drawRect:(NSRect)rect { //This is called automatically
// Drawing code here.
//NSLog(@"Within drawRect tool type is %d", [self currentTool]);
NSRect bounds = [self bounds];
NSRect aRect = [self currentRect];
viewPath = [self createPath:aRect];
//the createPath method uses the tool type to switch between oval and rect bezier curves
if(mouseUpFlag==YES && mouseDrag==YES){
mouseDrag=NO;
//Create a new drawnObject here
DrawnObject * anObject = [[DrawnObject alloc]init];//- WORKS FINE UP TO HERE
NSLog(@"CREATED NEW drawnObject");
[anObject setAPath:viewPath]; //- INSTANT APP DEATH!!!!
NSLog(@"Set a path in drawnObject");
[anObject setToolType:[[NSNumber alloc]initWithInt:5]];
NSLog(@"Set toolType in DrawnObject");
[anObject setToolType:currentToolType];
[myDrawing addObject:anObject];
NSLog(@"Added Object");
}
[[NSColor colorWithCalibratedRed:0.0 green:0.9 blue:0.0 alpha:0.5]set];
[NSBezierPath fillRect:bounds];
[[NSColor lightGrayColor]set];
[viewPath stroke]; //This is so the user can see where the drawing is being done
//Now, draw the paths in the array
[[NSColor blueColor]set];
for(DrawnObject * indexedObject in myDrawing){
[[indexedObject aPath] stroke];//This will do the actual drawing of ALL objects
}
}
Полагаю, это как-то связано с областью объекта или чем-то другим, но я просто не могу понять это. Как я уже сказал, когда я пробовал что-то, код претерпел метаморфозу, к сожалению, не в лучшую сторону. Как эти БУЛЫ и т. Д.
ПОМОГИТЕ! Любые умные люди, направьте меня в правильном направлении, пожалуйста!
ДОБАВЛЕНО НА ЭТОМ:
-(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;
}