区分自定义UIView

时间:2017-08-13 19:25:06

标签: ios swift uiview

我有一个继承自UIView的自定义类,其中包含UIImageView和按钮。我将它们添加到我的故事板UIView,让我们说有两种观点。我有一个委托和一个按下按钮时执行的功能,它适用于两个UIViews。

我的问题是我不知道怎么知道哪一个被点击了。我需要将它传递给另一个VC,然后在点击的UIView中显示合适的图像。我一直在考虑设置ID或其他东西,但它似乎不是一个非常可扩展的想法。 而且我不能简单地添加@IBAction,因为该视图是UIView整体。

在ViewController中我将它们添加为@IBOutlets:

@IBOutlet weak var view: CustomImageView!
@IBOutlet weak var view2: CustomImageView!

编辑: 我非常接近于创建可重用且可扩展的解决方案 - 我只是将标签分配给每个对象而不是传递它并检索它。我遇到的问题是我想访问标签的属性。我找不到任何解决方法。

1 个答案:

答案 0 :(得分:2)

代表解决方案 您可以为自定义视图添加自定义委托协议

protocol CustomViewDelegate {
    func didSelectCustomView(_ view: CustomView)
}

class CustomView: UIView {
    @IBOutlet weak var myImageView: UIImageView!
    @IBOutlet weak var myButton: UIButton!  

    weak var delegate: CustomViewDelegate?

    @IBAction func buttonPressed(sender: UIButton) {
        delegate?.didSelectCustomView(self)
    }
}

在ViewController中,您必须检查委托调用的视图来自:

class ViewController: UIViewController {
    @IBOutlet weak var view1: CustomView!
    @IBOutlet weak var view2: CustomView!

    override func viewDidLoad() {
        super.viewDidLoad()

        view1.delegate = self;
        view2.delegate = self;
    }
}

extension ViewController: CustomViewDelegate {
    func didSelectCustomView(_ view: CustomView) {
        if view == view1 {
            // view1 clicked
        } else {
            // view2 clicked
        }
    }
}

使用块解决方案 如果单击视图中的按钮,则可以添加一个可执行的块来代替委托:

class CustomView: UIView {
    @IBOutlet weak var myImageView: UIImageView!
    @IBOutlet weak var myButton: UIButton!

    var clicked: ((CustomView) -> Void)?

    @IBAction func buttonPressed(sender: UIButton) {
        clicked?(self)
    }
}

在ViewController中,您可以将块添加到视图中:

class ViewController: UIViewController {
    @IBOutlet weak var view1: CustomView!
    @IBOutlet weak var view2: CustomView!

    override func viewDidLoad() {
        super.viewDidLoad()

        view1.clicked = { view in

        }

        view2.clicked = { view in

        }
    }
}