11

如何以编程方式创建按钮?

self 在 swift 操场上不起作用:

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

错误 :

操场执行失败:错误::42:13:错误:使用未解析的标识符“自我”

我还尝试创建一个带有 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
4

3 回答 3

8

不幸的是,playground 中的控件不是交互式的。

前几天,我尝试通过创建和显示 Mac 操场来解决操场控件的非交互性问题NSWindow,但是,结果是窗口只是在操场后面闪现。

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

如果你很好奇,你可以在操场上试试下面的代码,看看我的意思。如果您打开活动监视器并进行过滤,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)

在此处输入图像描述

更新

我能够在 Swift 操场上获得一个半功能的 OS X 窗口,并将代码放在github repo中。我不确定基于 UIKit 的交互式视图是否可行。

于 2014-06-08T20:27:25.060 回答
8

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)
于 2016-03-25T22:00:44.293 回答
1

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

让你的类成为 NSObject 的子类。在您的类中创建一个 NSWindow 并将按钮和操作移动到您的类中。然后您可以将按钮的目标设置为 self.

用 UIKit 试试,让我们知道它是否有效。

于 2016-01-20T22:20:09.733 回答