2013-12-19 3 views
0

Как получить доступ к переменной экземпляра внутри блока событий мыши?
Это не работает, даже если я вызываю другой метод из определения события мыши.Rubymotion: как я могу получить доступ к переменной экземпляра изнутри блока mouseDown (event)?

Единственный способ, которым я нашел сейчас, - объявить переменную как переменную класса, но я не думаю, что это правильный путь.

обновляется с новым кодом

app_delegate.rb

class AppDelegate 
    def applicationDidFinishLaunching(notification) 

    @view = ViewController.new 

    end 
end 

view_controller.rb

class ViewController < NSView 

    def init 
    @var = "method called from event" 
    loadWindow 
    end 

    def loadWindow 
    @window = NSWindow.alloc.initWithContentRect([[400, 500], [480, 200]], 
     styleMask: NSTitledWindowMask|NSClosableWindowMask, 
     backing: NSBackingStoreBuffered, 
     defer: false) 
    @window.setTitle("Test") 

    @cView = ViewController.alloc.initWithFrame([[400,500], [480, 200]]) 
    @window.setContentView(@cView) 
    @window.orderFrontRegardless 
    @window.makeKeyWindow 
    runEvent      # <- This puts "method called from event" 
    end 

    def runEvent 
    puts @var 
    end 


    def mouseDown event 
    runEvent      # <- This puts a blank line 
    puts "mouse click" 
    end 
end 

ответ

0

Вы создаете два ViewController экземпляров, один с new и один с alloc.initWithFrame().

new является метод класса, который непосредственно сопоставляется alloc.init, таким образом, экземпляр @view звонит .init но .alloc.initWithFrame() нет.

Тот, который выводит runEvent «S содержимое представляет собой экземпляр @view (если он создан) и тот, который выводит на пустую строку @cView» с экземпляром (mouseDown).

Вы должны установить переменную в общем методе, а затем обеспечить initWithFrame метод:

def initWithFrame(frame) 
    super 
    setVar 
    self 
end 

def init 
    super 
    setVar 
    loadWindow 
    self 
end 

def setVar 
    @var = "method called from event" 
end 

работ:

method called from event 
(main)> method called from event 
mouse click 
(main)> method called from event 
mouse click 

Два отступлений: Всегда вызывать super в методе инициализации вы «переопределить» и всегда возвращать self. Кроме того, способ загрузки этих классов ViewController выглядит странно; похоже, что вы можете переместить половину кода в AppDelegate и избежать этой двусмысленности в целом.

+0

спасибо, теперь это более понятно. И я думаю, что мне действительно нужно больше читать по объективу c. Но мне нравятся грязные руки ... – vash

+0

Да, есть чему поучиться. Попадание в руки грязных/погружений - отличный способ узнать, если вы также готовы прочитать документы. :) –

+0

Используя rubymotion, я надеялся, что базового знания Objective C было достаточно. Очевидно, я был неправ. Можете ли вы порекомендовать некоторое полезное чтение, помимо ссылки на класс apple? – vash

1

Это всего лишь предположение, так как вы не предоставили полный фрагмент кода.

Если у вас есть такой код:

class SomeController 
    @var = "variable" 
end 

Вы не создаете переменную экземпляра, но переменная на уровне класса.

Это создаст переменную экземпляра:

class SomeClass 
    def initialize 
    @var = "some value" 
    end 
end 
+0

уверен, что вы правы, я написал очень минимальный примерный код. Но это не работает. – vash

+0

Ваш пример кода недостаточен, чтобы дать лучшее решение. вам нужно использовать метод инициализации (вы пытались инициализировать?) для установки переменных экземпляра. вместо переменной экземпляра вы можете использовать константу или метод. – phoet

+0

Я обновил код. – vash