Как сослаться на саму Swift Playground?

из Как создать кнопку программно?

self не работает на быстрой игровой площадке:

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

ошибка :

Ошибка выполнения игровой площадки: ошибка: :42:13: ошибка: использование неразрешенного идентификатора '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

person user310291    schedule 08.06.2014    source источник
comment
Это ваш полный код? Вы не можете ссылаться на self вне какого-либо метода класса   -  person BergQuester    schedule 08.06.2014
comment
@BergQuester да, я знаю по себе, поэтому я прошу альтернативу: как мне указать игровую площадку, где я бы определил функцию buttonAction? Я также пытался создать класс самостоятельно, но когда я нажимаю кнопку, он ничего не печатает (см. обновление кода)   -  person user310291    schedule 08.06.2014
comment
Я не думаю, что это возможно, потому что сейчас быстрая игровая площадка не может имитировать входные данные. В этом случае сенсорные события   -  person Waruna    schedule 08.06.2014
comment
Попался. Да, детские площадки на самом деле не интерактивные. Да, в некоторых случаях вы можете перемещаться вперед и назад во времени, но на самом деле вы не можете взаимодействовать с элементами управления.   -  person BergQuester    schedule 09.06.2014
comment
@BergQuester, как жаль, что я плачу :(   -  person user310291    schedule 09.06.2014
comment
Я знаю! Присоединяйтесь ко мне, отправив отчет об ошибке для запроса функции на bugreport.apple.com   -  person BergQuester    schedule 09.06.2014
comment
Никогда не используйте отчет об ошибках. Когда я иду туда, я получаю пустой список.   -  person user310291    schedule 09.06.2014


Ответы (3)


К сожалению, элементы управления на игровых площадках не интерактивны.

На днях я попытался обойти неинтерактивность элементов управления игровой площадкой, создав и отобразив NSWindow для игровой площадки Mac, однако в результате окно просто мигало за игровой площадкой.

Лучшее, что я могу сказать после некоторого изучения 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)

введите здесь описание изображения

ОБНОВЛЕНИЕ

Мне удалось получить полуфункциональное окно OS X на игровой площадке Swift и поместить код в репозиторий github. Я не уверен, что интерактивное представление на основе UIKit возможно.

person BergQuester    schedule 08.06.2014

В 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)
person MoFlo    schedule 25.03.2016
comment
Это работает! Тем не менее, есть 2 вещи, которые вы должны добавить к описанию. 1) импортировать XCPlayground 2) отобразить элемент в помощнике редактора. - person smileBot; 01.05.2016
comment
как вызвать переменную containerView внутри метода action() - person Vinod Rathod; 06.11.2017

Я делаю это успешно с Cocoa.

Сделайте свой класс подклассом NSObject. Создайте NSWindow в своем классе и переместите кнопку и действие в свой класс. Затем вы можете установить цель кнопки на себя.

Попробуйте это с UIKit и дайте нам знать, если это сработает.

person Gene De Lisa    schedule 20.01.2016