如何从同一个父级的其他UIViews控制/引用UIViews?

时间:2017-07-24 10:33:14

标签: ios swift uiview swift3 uiviewcontroller

我目前正在使用页面上的单个UIScrollView构建一个应用程序,其中包含3个UIViews。三个UIViewsleftPanelcenterPanelrightPanelleftPanel占屏幕宽度的30%,centerPanel占屏幕宽度的70%,rightPanel占屏幕宽度的30%。默认情况下会显示leftPanelcenterPanel,当用户从右向左滑动时,leftPanel会从左侧移出,而rightPanel会从对。中心面板从右侧向左侧移动。因此,leftPanelcenterPanelrightPanel都具有相同的超级视图,即屏幕上的UIScrollView。我打算在rightView内设置一个按钮,点按此按钮会使centerPanel中的UIImageView显示在底部。如何控制centerPanelUIButtonrightPanel的操作中的self.addSubview(leftPanel) self.addSubview(centerPanel) self.addSubview(rightPanel)

我的UIScrollView实现使用:

super

将三个子视图添加到scrollView。 我可以使用rightPanel关键字来获取centerPanel,UIScrollView的超级视图,但是如何从那里访问centerPanelAccess? 如果我可以在名为var centerPanelAccess = /* link to the centerPanel */ var imageView = /* The UIImageView to add */ centerPanelAccess.addSubview(imageView) 的变量中保存对UIView的引用,我打算做类似的事情:

centerPanel.addSubView(imageView) /* Error: Instance member 'addSubview' cannot be used on type 'UIView'; did you mean to use a value of this type instead?*/

以下是我到目前为止所做的尝试:

centerPanel

从上面看,我认为我需要引用我的代码正在使用的super.centerPanel.addSubView(imageView) /* Value of type 'UIView' has no member centerPanel */ 的特定实例,所以我尝试了这个,专门引用该实例:

UIScrollView

通过这次尝试,我意识到centerPanel中没有变量实际上允许我引用centerPanel

请问您如何在UIScrollView UIView类的代码中引用rightPaneltr的实例?

编辑:由于似乎不建议从其他视图中访问和操作视图,是否有解决此问题的方法?

2 个答案:

答案 0 :(得分:2)

视图不应直接通信。视图控制器应协调视图之间的活动。此视图控制器应该已经引用了leftcenterright视图。

您可以创建一个协议,以便right视图可以通知视图控制器该按钮被点击:

protocol RightViewDelegate {
    func buttonWasTapped()
}

然后您的RightView可以支持此类代表:

class RightView: UIView {

     var delegate: RightViewDelegate?

     @IBAction buttonHandler(_ sender: UIButton) {
         self.delegate?.buttonWasTapped()
}

ViewController中设置代理并通过调用方法在委托方法中处理按钮,在中心视图中添加新内容:

class ViewController: UIViewController, RightViewDelegate {

    var leftView: LeftView!
    var rightView: RightView!
    var centerView: CenterView!

    func viewDidLoad {
        super.viewDidLoad()

     // After you set your views into your scroll view:
        self.rightView.delegate = self
    }


    func buttonWasTapped() {
        self.centerView.addView()
    }
}

答案 1 :(得分:-2)

制作这些子视图时,您可以为它们提供一些独特的标签,例如:

leftPanel.tag = 111
centerPanel.tag = 222
rightPanel.tag = 333

然后在rightView类中,您可以使用标记

获取中心面板
var centerPanelAccess:UIView = self.superview.viewWithTag(222) as! UIView

这里self指向rightView,因此superview对象将为您提供添加rightView的scrollView。一旦你有了scrollView,你就可以通过viewWithTag()方法得到它的中心面板。希望你明白了。