2017-08-13 58 views
1

我从UIView继承了其内部的自定义类是UIImageView和按钮。我将它们添加到我的故事板中,作为UIView,让我们假设有两个视图。我有一个委托和一个函数,当按下按钮时它会执行,并且它适用于两个UIViews。被点击区分是哪个按钮,在自定义的UIView

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

的视图控制器里面我加他们为@IBOutlets:

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

编辑: 我很接近创建可重用,可扩展的解决方案 - 我只是分配标签,以每一个物体和比传递它并检索它。我遇到的问题是我想访问标签的属性。我没有找到任何解决方法。

回答

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 
     } 
    } 
} 

解取而代之的是代表块 ,你可以添加一个可选模块,即EXE cuted如果在视图按钮被点击:

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 

     } 
    } 
} 
+0

呀,这不是坏的,正如我所说的也许有效,但:不是可扩展的解决方案。你可以看到我的答案 - 这几乎是我添加的所有代码,在你的解决方案中有很多if else语句。在我看来,最好为示例设置5个标签,而不是创建大量的其他块。 – codddeer123

+0

您也可以使用映射标签或查看图像引用的字典。 'let image = dict [tag]'但更好的方法是创建一个包含你的视图的自定义组件。这样你的ViewController就会保持精简。 – messeb

+0

@ codddeer123你没有说你想做什么,所以这个答案包含通用的代码。如果你只是想设置一个图像,那么你不需要'if'语句(尽管如果有2个以上的可能性,我会使用'switch')或者多个块。你可以说'view.imageView.image = xxx'。涉及标签的解决方案最好避免。他们可能会由于重复的标签,每一次搜索视图层次结构来识别标记的看法错误是低效 – Paulw11

相关问题