如何在鼠标事件块中访问实例变量?
即使我从鼠标事件定义中调用其他方法,它也不起作用。
我现在找到的唯一方法是将变量声明为类变量,但我认为这不是正确的方法。
使用新代码更新
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 :(得分:1)
这只是一个假设,因为您没有提供完整的代码段。
如果你有这样的代码:
class SomeController
@var = "variable"
end
您不是在类级别创建实例变量,而是创建变量。
这将创建一个实例变量:
class SomeClass
def initialize
@var = "some value"
end
end
答案 1 :(得分:0)
您正在创建两个ViewController
个实例,一个包含new
个实例,另一个包含alloc.initWithFrame()
个实例。
new
是一种直接映射到alloc.init
的类方法,因此@view
实例正在调用.init
,但.alloc.initWithFrame()
不是。{/ p >
输出runEvent
内容的是@view
实例(创建时),输出空行的实例是@cView
的实例({{1 }})。
您需要在常用方法中设置变量,然后提供mouseDown
方法:
initWithFrame
使用:
def initWithFrame(frame)
super
setVar
self
end
def init
super
setVar
loadWindow
self
end
def setVar
@var = "method called from event"
end
两个旁白:始终在您覆盖的init方法中调用method called from event
(main)> method called from event
mouse click
(main)> method called from event
mouse click
,并始终返回super
。此外,您加载这些self
类的方式有点奇怪;看起来您可以将代码的一半移到ViewController
中,并完全避免这种歧义。