2016-07-20 3 views
1

프로그래밍 방식으로 UISwitch를 만들려고합니다 (IBOutlets 또는 IBActions 없음). 눌렀을 때 스위치가 상태를 변경하는 방법을 파악할 수 없습니다. 나는 생각했다 ... 그 Swift - UISwitch가 켜지거나 꺼질 때 업데이트되지 않습니다.

mySwitch.addTarget() 

... 스위치가 켜기/끄기 전환 할 때마다 호출 될 것이지만, 그런 경우가 될 것 같지 않습니다. 누군가 내가 뭘 잘못하고 어떻게 수정 설명 할 수 있을까요.

import UIKit 
import XCPlayground 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 568 * 0.75)) 

view.backgroundColor = UIColor.whiteColor() 
view.layer.borderColor = UIColor.grayColor().CGColor 
view.layer.borderWidth = 1 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 50)) 

label.text = "Label" 
label.textAlignment = NSTextAlignment.Center 

view.addSubview(label) 

func switchChanged(sender: UISwitch!) { 
    if sender.on == true { 
     label.text = "Switch is ON" 
    } else if sender.on == false { 
     label.text = "Switch is OFF" 
    } 
} 

let mySwitch = UISwitch() 

mySwitch.center = view.center 
mySwitch.setOn(true, animated: false) 
mySwitch.onTintColor = UIColor.redColor() 
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

view.addSubview(mySwitch) 

XCPlaygroundPage.currentPage.liveView = view 

답변

0
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

는하지만 그것은 switchChanged 함수를 포함하는 라벨되지 않습니다 : 그것은 당신을합니다.

실제 앱 프로젝트 (예 : 놀이터가 아닌)에서 제대로 구성하면 훨씬 편리합니다. self의 역할을 할 수 있으며 대상이 될 수있는보기 컨트롤러가 있습니다.

+1

놀이터에서 이런 심각한 상호 작용을 시도하지 마십시오. 개구리에게 키스를하는 것과 같습니다. 아무 일도 일어나지 않아 개구리가 화가납니다. – matt

1

당신은이 라인에 대한 몇 가지 수정이 필요합니다

mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

addTarget가 작동하려면, 당신은 작업에 응답 인스턴스가 필요합니다. 분명히 labelswitchChanged에 응답하지 않습니다.

클래스에서 액션 메소드를 동봉 : 당신이 Selector(switchChanged(mySwitch))이, 스위프트가 인수 switchChanged(mySwitch)을 실행 작성한 다음 Selector.init 그 결과를 통과하면

class MyTarget { 
    @objc func switchChanged(sender: UISwitch!) { 
     if sender.on == true { 
      label.text = "Switch is ON" 
     } else if sender.on == false { 
      label.text = "Switch is OFF" 
     } 
    } 
} 

또 다른 문제는, Selector.init의 사용이다. switchChanged의 반환 유형은 Void이지만 코드는 Selector()과 거의 같습니다.

#selector 표기법을 가능한 한 사용해보십시오. 이 경우 위에 소개 한 클래스를 사용하여 #selector(MyTarget.switchChanged)으로 작성할 수 있습니다.

그래서, addTarget 제대로, 당신은 라인을 변경해야 : 이러한 변화와 함께, 내 엑스 코드 일종의 고집 나는 실재의 타임 라인을 볼 엑스 코드를 다시 시작하기 위해 필요한, 그러나

let target = MyTarget() 
mySwitch.addTarget(target, action: #selector(MyTarget.switchChanged), forControlEvents: .ValueChanged) 

, I 귀하의 코드가 예상대로 작동한다고 생각하십시오.

관련 문제