【초보자용】Swift3로 폭속 코딩 그 3(버튼 클릭과 이벤트)

Playground에 의한 코딩입니다.
첫 분은 아래를 참고하십시오.

제1회: 【초보자용】Swift3로 폭속 코딩 그 1(화면 작성과 Snippets의 사용법)
제2회: 【초보자용】Swift3로 폭속 코딩 그 2(UIView와 문자 표시)

버튼 클릭



조속하지만 모든 소스 코드입니다.
이벤트에 관해서는 움직여 보는 편이 빠르다고 생각하므로・・・

Test.playground
import UIKit


class ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()


        // Buttonを生成する
        let button = UIButton()
        button.frame = CGRect(x:0,y:0,width:200,height:40)
        button.backgroundColor = UIColor.blue
        button.layer.masksToBounds = true
        // ボタンの状態
        button.setTitle("ボタン", for: UIControlState.normal)
        button.setTitleColor(UIColor.white, for: UIControlState.normal)
        // 押された時
        button.setTitle("押されました", for: UIControlState.highlighted)
        button.setBackgroundImage(self.colorToImage(color: UIColor.orange), for: UIControlState.highlighted)
        button.tag = 1 // ボタン識別用ID

        button.layer.cornerRadius = 10.0
        button.layer.position = CGPoint(x: button.bounds.width/2
            , y:button.bounds.height/2)
        button.addTarget(self, action: #selector(self.onClick(_:)), for: .touchUpInside)

        self.view.addSubview(button)

        print(self.view.perform(Selector(("recursiveDescription"))))

    }

    func onClick(_ sender: AnyObject){
        let button = sender as! UIButton
        print("sender.tag:\(button.tag)")

        // アラート表示
        let alert: UIAlertController = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .default) { action in
            print("Action OK!!")
        }
        alert.addAction(okAction)
        self.present(alert, animated: true, completion: nil)
    }

    func colorToImage(color:UIColor)->UIImage{
        let rect = CGRect(x:0, y:0, width:1.0,height: 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context:CGContext = UIGraphicsGetCurrentContext()!

        context.setFillColor(color.cgColor)
        context.fill(rect)

        let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        return image
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

let viewController = ViewController()
viewController.view.backgroundColor = UIColor.white



import PlaygroundSupport

PlaygroundPage.current.liveView = viewController
PlaygroundPage.current.needsIndefiniteExecution = true

미리보기





버튼을 클릭하면 다음과 같은 팝업(경고)이 표시됩니다.



이벤트 추가



클릭 이벤트를 추가하는 부분은 다음과 같습니다.
addTarget 메서드를 사용하여 이벤트를 호출합니다.
action 매개 변수는 호출할 메서드를 지정합니다.
이번에는 자체 제작 onClick 메서드를 만들고 호출합니다.
for 매개변수는 이벤트를 발생시키기 위한 조치의 유형을 지정합니다.
조건을 만족하는 타이밍에 메소드가 불려 갑니다.
이번에는 가장 많이 사용되는 타이밍
touchUpInside (버튼을 눌러 버튼 영역 내에서 버튼을 놓은 상태)로 지정합니다.
button.addTarget(self, action: #selector(self.onClick(_:)), for: .touchUpInside)

이벤트의 종류에 대해서는 UIControlEvents 열거체로 정의되고 있습니다.
UIControl 클래스를 상속한 UIButton, UISlider, UISwitch, UITextField 등은 addTarget 메서드에 의한 이벤트 추가를 할 수 있습니다.
자주 사용하는 이벤트를 열어 둡니다.
  • touchUpInside : 컴포넌트가 눌러져 컴포넌트의 영역 내에서 떨어진 타이밍으로 불린다 (UIButton)
  • valueChanged : 컴포넌트의 파라미터가 변경된 타이밍으로 불린다 (UISwitch, UISlider)
  • editingBegin : 컴퍼넌트의 포커스가 맞추어 편집 모드가 된 타이밍으로 불린다 (UITextField)
  • editingEnd : 컴퍼넌트의 포커스가 벗어나 편집 모드가 해제 된 타이밍으로 불린다 (UITextEnd)
  • editingChanged : 컴퍼넌트의 텍스트가 변경된 타이밍으로 불린다 (UITextField)

  • onClick 메소드는 다음과 같습니다.
    UIAlertController는 팝업(경고)을 생성하기 위한 UI입니다.
    UIViewConrtoller 클래스의 present 메소드에서 팝업을 호출합니다.
    func onClick(_ sender: AnyObject){
         let button = sender as! UIButton
         print("sender.tag:\(button.tag)")
    
         // アラート表示
         let alert: UIAlertController = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)
         let okAction = UIAlertAction(title: "OK", style: .default) { action in
            print("Action OK!!")
         }
         alert.addAction(okAction)
         self.present(alert, animated: true, completion: nil)
    }
    

    button.tag는 UI를 식별하는 번호입니다.
    동일한 메소드에 대해 여러 UI 구성 요소를 addTarget 할 수 있습니다.
    그것을 구별하는 데 사용합니다.

    예를 들어 두 개의 버튼이있는 경우 다음과 같이 두 버튼
    누르거나 onClick 메소드 측에서 알 수 있습니다.
    button1.tag=1
    button2.tag=2
    button1.addTarget(self, action: #selector(self.onClick(_:)), for: .touchUpInside)
    button2.addTarget(self, action: #selector(self.onClick(_:)), for: .touchUpInside)
    

    이벤트 삭제



    이벤트를 삭제하려면 removeTarget 메서드를 사용합니다.
    onClick 메소드의 끝에 다음과 같이 추가하십시오.
    button.removeTarget(self, action: #selector(self.onClick(_:)), for: .touchUpInside)
    

    두 번째 이후 onClick 메서드가 호출되지 않게 될 것입니다.

    기타 보충(하이라이트)



    setTitle 메소드나 setBackgroundImage 메소드에 대해서
    for 파라미터로 하이라이트 상태(클릭 선택 상태)의 변화를 지정하고 있습니다.
    button.setTitle("押されました", for: UIControlState.highlighted)
    button.setBackgroundImage(self.colorToImage(color: UIColor.orange), for: UIControlState.highlighted)
    

    setBackgroundImage에는 이미지(UIImage)를 지정해야 합니다만
    이번은 자작의 colorToImage 메소드로
    색 데이터(UIColor)로부터 단색의 화상 데이터(UIImage)를 작성하고 있습니다.
    func colorToImage(color:UIColor)->UIImage{
         let rect = CGRect(x:0, y:0, width:1.0,height: 1.0)
         UIGraphicsBeginImageContext(rect.size)
         let context:CGContext = UIGraphicsGetCurrentContext()!
    
         context.setFillColor(color.cgColor)
         context.fill(rect)
    
         let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
         UIGraphicsEndImageContext()
    
         return image
    }
    

    좋은 웹페이지 즐겨찾기