2012-04-17 4 views
0

У меня есть два окна, мое главное окно «окно» и «окно справки» внутри моего приложения-делегата. В моем главном окне его представление подклассом, и я хочу нарисовать прямоугольник внутри него. Окно моей справки также имеет прямоугольник, но на нем есть NSTracker. То, что я хочу сделать, это нарисовать мой прямоугольник в моем подклассе окна с координатами x и y, равными моей позиции NSTracker. Проблема, с которой я столкнулась, это сбой, когда я пытаюсь ввести координаты, любые идеи о том, что я могу делать неправильно? спасибоДоступ к переменной int из другого класса

// Мой подкласс окна называется CutoutView. Это все в розыгрыше прямоугольнику

AppDelegate *controller = [[[NSApp delegate] window] contentView]; 

     xValue = controller.mouseLoc.x; 
     yValue = controller.mouseLoc.y; 

     NSRectFillUsingOperation(NSMakeRect(xValue,yValue, 600, 400), NSCompositeClear); 
     [self update]; 

- (void)update 
{ 
    NSLog(@"test"); 
    [self setNeedsDisplay:YES]; 
} 

// Моя AppDelegate с трекером helpView является ссылкой на мнение моего второго окна «Помощь Window»

-(void)updateTrackingAreas 
{ 
    if(trackingArea != nil) { 
     [self.helpView removeTrackingArea:trackingArea]; 
     [trackingArea release]; 
    } 

    opts = (NSTrackingActiveAlways | NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved); 

    trackingArea = [ [NSTrackingArea alloc] initWithRect:[self.helpView bounds] 
               options:opts 
                owner:self 
               userInfo:nil]; 
    [self.helpView addTrackingArea:trackingArea]; 
    } 

    -(void)mouseMoved:(NSEvent *)theEvent 
    { 
     mouseLoc = [NSEvent mouseLocation]; 
     NSLog(@"mouseMoved: %f %f", mouseLoc.x, mouseLoc.y); 

    } 

в моем CutoutView я я получаю AppController неправильно, потому что он находится в другом окне «helpWindow»? или это связано с моими значениями int?

+0

Какая линия рушится? Что такое сообщение об ошибке? –

+0

говорит, что mouseLoc является непризнанным селектором, посланным экземпляру, My mouseLoc является NSPoint для трекера, является ли проблема, берущая значения x и y и получающие их от значений int xValue и yValue? –

ответ

1

В коде есть много неправильного кода, и очевидно, что вы принципиально недопонимаете некоторые базовые понятия.

Во-первых, вы указываете, что этот код находится в вашем методе drawRect:;

AppDelegate *controller = [[[NSApp delegate] window] contentView]; 

xValue = controller.mouseLoc.x; 
yValue = controller.mouseLoc.y; 

NSRectFillUsingOperation(NSMakeRect(xValue,yValue, 600, 400), NSCompositeClear); 
[self update]; 

Существует несколько непосредственных недостатков. Во-первых, почему вы объявляете controller типа AppController*, когда метод, который вы вызываете (-contentView), возвращает NSView?

Ваш AppController не вид (по крайней мере, это не должно быть!), Так что вы должны объявить объект как таковой:

NSView* mainView = [[[NSApp delegate] window] contentView]; 

Если вы действительно с помощью представления в качестве контроллера, то это совершенно неправильно. См. Ниже мою заметку о MVC.

Вы не указали, откуда берется объект mouseLoc. Нам нужно увидеть, где это объявлено, потому что это повлияет на наличие или отсутствие проблем с ним.

Ваш код рисунка вызывает [self update], который просто указывает на просмотр, чтобы перерисовать себя. Это приведет к бесконечному циклу, потому что каждый раз, когда изображение рисует, он вынужден перерисовываться. Вы должны никогда позвонить setNeedsDisplay: изнутри drawRect:.

Даже после внесения этих изменений этот код очень плохо структурирован и конструкция нарушена.

В своем роде ваш код нарушает шаблон Model-View-Controller. Взгляды не должны знать другие взгляды. Вам необходимо реструктурировать вещи, чтобы ваши представления отображали свойства вашего контроллера, не требуя знания других представлений. Это означает, что вы должны хранить местоположение мыши в своем контроллере (или объекте модели) и использовать некоторый метод представления для доступа к этой информации, предпочтительно протокол источника данных или аналогичный. В my answer to this other question Я приведу пример того, как это сделать.

Вам необходимо прочитать Cocoa Drawing Guide. Вам также нужно узнать больше core Cocoa concepts, так как ясно, что вы не понимаете, как работает какао.

Смежные вопросы