2014-06-08 30 views
10

How to create a button programmatically?如何参考斯威夫特游乐场本身?

自不迅速游乐场工作:

button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside) 

错误:

Playground execution failed: error: :42:13: error: use of unresolved identifier 'self'

我也试过里面编译为创建buttonAction方法的类,但是当我点击在按钮上无控制台打印

import UIKit 

class myself { 


    func buttonAction(sender:UIButton!) 
    { 
     println("Button tapped") 
    } 

} 

var s = myself() 

// Create View 
var f = CGRect(x:0,y:0,width:200,height:200) 
var view = UIView(frame:f) 


// Create Button 
var b = UIButton(frame: f) 
b.setTitle("Hello", forState: UIControlState.Normal) 
b.addTarget(s, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside) 

view.addSubview(b) 

view 
+0

是您的完整代码?你不能在某种类的方法之外引用'self' – BergQuester

+1

@BergQuester是的我知道自己这就是为什么我要求替代方法:我如何引用操作符来定义buttonAction函数?我也尝试自己创建一个类,但是当我点击按钮时它不打印任何东西(请参阅代码更新) – user310291

+0

我不认为这是可能的,因为现在快速操场不能模拟输入。在这种情况下触摸事件 – Waruna

回答

7

不幸的是,操场上的控件并不互动。

我试图在Mac操场上创建并显示NSWindow来避开游乐场控制的非交互性,但结果是窗口简单地在操场后面闪现。

最好的,我可以一些探讨NSProcessNSBundleNSApplication和观察系统活动监视器后告诉,操场实际上编译你的代码,将其加载到一个存根应用程序,执行,操场捕获结果并显示它们,然后存根应用程序退出或等待下一次执行。这意味着当你看到结果时,代码不再执行。

如果你很好奇,你可以在操场上试试下面的代码,看看我的意思。如果打开活动监视器并在PlaygroundStub_OSX上过滤,则可以看到运行代码启动的过程。它通常处于“无响应”状态。我还包含了代码探测部分结果的屏幕截图。

import Cocoa 

var app = NSApplication.sharedApplication() 
app.hidden 

var procInfo = NSProcessInfo.processInfo() 
procInfo.processName 
procInfo.arguments 

var bundle = NSBundle.mainBundle() 
bundle.bundlePath 



var window = NSWindow(contentRect: NSRect(x: 30, y: 30, width: 400, height: 400), styleMask: NSTitledWindowMask, backing: .Buffered, defer: false) 


var view = NSView(frame: NSRect(x: 0, y: 0, width: 300, height: 300)) 

var textField = NSTextField(frame: NSRect(x: 30, y: 30, width: 100, height: 20)) 

textField.stringValue = "Test" 

view.addSubview(textField) 

var button = NSButton(frame: NSRect(x: 30, y: 60, width: 100, height: 30)) 

button.highlight(true) 

var buttonCell:NSButtonCell = button.cell() as NSButtonCell 
buttonCell.bezelStyle = NSBezelStyle.RoundedBezelStyle 


view.addSubview(button) 

window.contentView.addSubview(view) 



window.makeKeyAndOrderFront(nil) 

enter image description here

UPDATE

我能够以迅速操场得到一个半功能OS X的窗口,并置于该代码在一个github repo。我不确定是否可以使用基于交互式UIKit的视图。

1

我用Cocoa成功地做到了这一点。

使你的类成为NSObject的一个子类。在你的班级中创建一个NSWindow,并将按钮和动作移到你的班级中。然后你可以设置按钮的目标为自己。

尝试使用UIKit并让我们知道它是否有效。

7

现在支持Xcode 7.3。您需要声明一个ObjectiveC对象或使用@objc关键字作为目标来公开一个函数:

class Responder : NSObject { 
    func action() { 
     print("Button pressed!") 
    } 
} 

let containerView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 375.0, height: 667.0)) 
XCPlaygroundPage.currentPage.liveView = containerView 
let responder = Responder() 

let button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 
button.backgroundColor = UIColor.greenColor() 
button.setTitle("TEST", forState: .Normal) 
button.addTarget(responder, action: #selector(Responder.action), forControlEvents: .TouchUpInside) 
containerView.addSubview(button) 
+1

This works!然而,有两件事你应该添加到描述。1)import XCPlayground 2)在助理编辑器中显示元素。 – smileBot

+0

如何在action()方法内部调用containerView变量 –