我目前正在使用页面上的单个UIScrollView
构建一个应用程序,其中包含3个UIViews
。三个UIViews
是leftPanel
,centerPanel
和rightPanel
。 leftPanel
占屏幕宽度的30%,centerPanel
占屏幕宽度的70%,rightPanel
占屏幕宽度的30%。默认情况下会显示leftPanel
和centerPanel
,当用户从右向左滑动时,leftPanel
会从左侧移出,而rightPanel
会从对。中心面板从右侧向左侧移动。因此,leftPanel
,centerPanel
和rightPanel
都具有相同的超级视图,即屏幕上的UIScrollView
。我打算在rightView
内设置一个按钮,点按此按钮会使centerPanel中的UIImageView
显示在底部。如何控制centerPanel
中UIButton
上rightPanel
的操作中的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
类的代码中引用rightPanel
中tr
的实例?
编辑:由于似乎不建议从其他视图中访问和操作视图,是否有解决此问题的方法?
答案 0 :(得分:2)
视图不应直接通信。视图控制器应协调视图之间的活动。此视图控制器应该已经引用了left
,center
和right
视图。
您可以创建一个协议,以便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()方法得到它的中心面板。希望你明白了。