2014-06-08 15 views
10

từ How to create a button programmatically?Làm cách nào để tự tham khảo Swift Playground?

tự không hoạt động trong sân chơi nhanh chóng:

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

lỗi:

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

Tôi cũng đã cố gắng để tạo ra một lớp học với phương pháp buttonAction bên trong nó biên dịch nhưng khi tôi bấm trên nút không có gì in trong bảng điều khiển

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

Đó là mã đầy đủ của bạn phải không? Bạn không thể tham chiếu 'self' bên ngoài một số loại phương thức lớp học – BergQuester

+1

@BergQuester vâng tôi biết vì lý do tại sao tôi yêu cầu thay thế: làm thế nào để tôi tham khảo sân chơi, nơi tôi sẽ định nghĩa buttonAction func? Tôi cũng cố gắng tự tạo một lớp nhưng khi tôi nhấn nút, nó không in bất cứ thứ gì (xem mã cập nhật) – user310291

+0

Tôi không nghĩ điều này là có thể, bởi vì ngay bây giờ sân chơi nhanh không thể mô phỏng đầu vào. Trong trường hợp này, hãy chạm vào sự kiện – Waruna

Trả lời

7

Thật không may, điều khiển trong sân chơi không tương tác.

Tôi đã cố gắng tránh việc điều khiển sân chơi không tương tác vào ngày khác bằng cách tạo và hiển thị NSWindow cho sân chơi Mac, tuy nhiên, kết quả là cửa sổ chỉ nháy phía sau sân chơi.

tốt nhất mà tôi có thể nói sau khi một số thăm dò vào NSProcess, NSBundle, NSApplication và xem Monitor Hoạt động hệ thống, sân chơi thực sự biên dịch mã của bạn, tải nó vào một ứng dụng còn sơ khai, thực thi, sân chơi nắm bắt được kết quả và hiển thị chúng sau đó ứng dụng gốc thoát ra hoặc chờ xung quanh để thực hiện tiếp theo. Điều này có nghĩa là khi bạn thấy kết quả, mã không còn thực thi nữa.

Nếu bạn tò mò, bạn có thể thử mã bên dưới trong một sân chơi để xem ý tôi là gì. Nếu bạn mở Activity Monitor và lọc trên PlaygroundStub_OSX bạn có thể thấy quá trình chạy mã khởi chạy. Đó là lần trong trạng thái "Không phản hồi". Tôi cũng đã bao gồm một ảnh chụp màn hình của các kết quả của phần thăm dò của mã.

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

CẬP NHẬT

tôi đã có thể để có được một cửa sổ bán chức năng OS X trong một sân chơi Swift và đặt mã trong một github repo. Tôi không chắc chắn nếu một UIKit tương tác dựa trên xem là có thể được nêu ra.

1

Tôi làm điều này thành công với Cocoa.

Biến lớp của bạn trở thành lớp con của NSObject. Tạo NSWindow trong lớp học của bạn và di chuyển nút và hành động vào lớp học của bạn. Sau đó, bạn có thể đặt mục tiêu của nút thành tự.

Hãy thử với UIKit và cho chúng tôi biết nếu nó hoạt động.

7

Với Xcode 7.3, tính năng này hiện được hỗ trợ. Bạn cần khai báo đối tượng ObjectiveC hoặc hiển thị hàm bằng cách sử dụng từ khóa @objc làm mục tiêu:

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

Điều này hoạt động! Tuy nhiên, có 2 điều mà bạn nên thêm vào mô tả 1) nhập khẩu XCPlayground 2) hiển thị phần tử trong trình soạn thảo trợ lý. – smileBot

+0

cách gọi biến containerView bên trong phương thức action() –

Các vấn đề liên quan