如何将事件发送到我的(子)UIView?

时间:2017-05-20 14:44:07

标签: ios iphone swift uiview

我是Swift的新手,很难理解事件流程。下面的代码可以直接在xcode游乐场中运行。我在后台有一个白色的UIView。此视图有一个棕色按钮和一个红色视图作为子视图。单击它们,事件将记录在控制器中,与预期一样。

但是这个白色视图的控制器还添加了另一个视图,它有自己的控制器类(SubviewController)。 SubviewController是绿色的,有一个带有黑色按钮的蓝色子视图。问题是......为什么我没有从绿色,蓝色和黑色视图/按钮获取任何日志?

import Foundation
import UIKit
import PlaygroundSupport

class TestViewController : UIViewController {

    let playButton: UIButton = {
        let playButton = UIButton(frame: CGRect(x: 155, y: 135, width: 160, height: 40))
        playButton.setTitle("BROWN BUTTON", for: .normal)
        playButton.backgroundColor = UIColor.brown
        return playButton
    }()


    override func loadView() {
        let viewWhite = UIView()
        viewWhite.backgroundColor = UIColor.white

        let viewRed = UIView()
        viewRed.backgroundColor = UIColor.red
        viewRed.frame = CGRect(x: 20, y: 20, width: 40, height: 10)
        viewRed.clipsToBounds = true
        let recognizer2 = UITapGestureRecognizer(target: self, action:  #selector (self.handleTapRed(_:)))
        viewRed.addGestureRecognizer(recognizer2)


        let recognizer = UITapGestureRecognizer(target: self, action:  #selector (self.handleTap(_:)))

        viewWhite.addGestureRecognizer(recognizer)

        playButton.addTarget(self,  action:  #selector (self.action) , for: .touchUpInside)

        let catList = SubviewController()

        viewWhite.addSubview(catList.view)
        viewWhite.addSubview(playButton)
        viewWhite.addSubview(viewRed)
        self.view = viewWhite
    }

    func action() {
        print("Brown button tapped")
    }

    func handleTap(_ sender:UITapGestureRecognizer){
        print("WHITE VIEW (background view) TAPPED")
    }

    func handleTapRed(_ sender:UITapGestureRecognizer){
        print("RED VIEW TAPPED")
    }

}

class SubviewController: UIViewController {

    let buttonBlack: UIButton = {
        let button = UIButton(frame: CGRect(x: 40, y: 10, width: 170, height: 20))
        button.backgroundColor = UIColor.black
        button.setTitle("BLACK BUTTON", for: .normal)
        return button
    }()

    let viewBlue: UIView = {
        let v = UIView()
        v.backgroundColor = UIColor.blue
        v.frame = CGRect(x: 20, y: 40, width: 240, height: 60)
        v.clipsToBounds = true
        return v
    }()

    override func loadView() {
        super.loadView()
        self.view.backgroundColor = UIColor.green
        buttonBlack.addTarget(self,  action:  #selector (self.blackKlick) , for: .touchUpInside)

        self.view.addSubview(viewBlue)

        self.view.frame = CGRect(x: 0, y: 40, width: 240, height: 60)
        self.view.clipsToBounds = true

        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action:  #selector (self.handleTapGreen(_:))))

        viewBlue.addGestureRecognizer(UITapGestureRecognizer(target: self, action:  #selector (self.handleTapBlue(_:))))
        viewBlue.addSubview(buttonBlack)
    }

    func blackKlick() {
        print("Black button tapped")
    }

    func handleTapBlue(_ sender:UITapGestureRecognizer){
        print("BLUE VIEW TAPPED")
    }

    func handleTapGreen(_ sender:UITapGestureRecognizer){
        print("GREEN VIEW TAPPED")
    }
}

 PlaygroundPage.current.liveView = TestViewController()

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您当前代码中的这一行:

    let catList = SubviewController()

创建SubvieController本地实例。退出loadView() func后,该实例就会消失。

因此,您需要一个类级变量来保持该实例。添加以下行:

class TestViewController : UIViewController {

    var catList: SubviewController!

然后从let中的实例化行中删除loadView()

    catList = SubviewController()