Что-то не так с моим объектом? - PullRequest
0 голосов
/ 28 ноября 2008

Это программа, которую я пишу (я сам в отличие от копирования чужого и, следовательно, не учусь) как часть кривой обучения 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;
}

Ответы [ 6 ]

2 голосов
/ 28 ноября 2008

Вы сказали, что ваш метод инициализации:

-(void)init {
[super init];
//set default color = black
toolColor.rd=1.0;
toolColor.grn=1.0;
toolColor.blu=1.0;
toolColor.alp=1.0;
//set default size
toolSize=0.8;
//set default toolType
toolType=0;
//oval
NSLog(@"Init %@",self);
}

Это определенно неправильно; читайте о том, как создать метод init, в руководстве Obj-C или читая пример кода. Вот как это должно выглядеть:

-(id)init {
if (self = [super init]) {
    //set default color = black
    toolColor.rd=1.0;
    toolColor.grn=1.0;
    toolColor.blu=1.0;
    toolColor.alp=1.0;
    //set default size
    toolSize=0.8;
    //set default toolType
    toolType=0;
    //oval
    NSLog(@"Init %@",self);
}
return self;
}

Не возвращая ничего из -init, вы препятствовали созданию объекта. Удачи! : -)

Редактировать: Эшли победила меня ...

0 голосов
/ 29 ноября 2008

То, что у вас есть, не является крахом. Сбой - это когда возникает сигнал (например, EXC_BAD_ACCESS) или необработанное исключение.

То, что у вас есть, кажется бесконечным циклом.

Вам нужно использовать кнопку паузы в отладчике и посмотреть, где именно. Я предполагаю, что у вас есть бесконечный цикл в вашем setAPath: метод. Вам нужно выяснить, почему эта функция зацикливается бесконечно.

0 голосов
/ 28 ноября 2008

В командной строке вы можете напечатать print-object и вы можете установить точку останова в этой строке и пройти через нее оттуда. Кажется, setAPath как-то не работает

С уважением Friedrich

0 голосов
/ 28 ноября 2008

Нам нужно увидеть реализацию setAPath из DrawnObject.m. Также, для «трассировки стека» посмотрите в верхнем левом углу отладчика - он должен перечислить стек функций, показывающих, где в вашем коде происходит сбой. Убедитесь, что вы работаете в режиме отладки, а не в версии.

0 голосов
/ 28 ноября 2008

просто висит. В отладчике вижу:

  [Session started at 2008-11-28 14:40:34 +1000.]
2008-11-28 14:40:36.157 CH18Challenge_try2[1893:10b] Mouse Down at (80.000000,285.000000)
2008-11-28 14:40:36.333 CH18Challenge_try2[1893:10b] Mouse Up at (166.000000,217.000000)
2008-11-28 14:40:36.348 CH18Challenge_try2[1893:10b] Init 
2008-11-28 14:40:36.349 CH18Challenge_try2[1893:10b] CREATED NEW drawnObject

[Session started at 2008-11-28 14:40:36 +1000.]
Loading program into debugger…
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin".Program loaded.
sharedlibrary apply-load-rules all
Attaching to program: `/Users/johan_kritzinger/Documents/Cocoa/CH18Challenge_try2/build/Debug/CH18Challenge_try2.app/Contents/MacOS/CH18Challenge_try2', process 1893.
(gdb) 

Тогда я должен заставить выйти, чтобы остановить его.

0 голосов
/ 28 ноября 2008

Что вы подразумеваете под «сбой»?

Появляется ли что-нибудь в консоли отладчика (⇧⌘R)?

Появляется ли трассировка стека в окне отладчика?

Если есть трассировка стека, где в вашем коде происходит сбой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...