我目前正在构建一个页面上只有一个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
?
我的UIScrollView实现使用:
self.addSubview(leftPanel)
self.addSubview(centerPanel)
self.addSubview(rightPanel)
将三个子视图添加到scrollView。
我可以使用
super
关键字来获取rightPanel
(UIScrollView)的超级视图,但是如何从那里访问centerPanel
?如果我可以将对UIView的引用保存在名为
centerPanelAccess
的变量中,则打算执行以下操作:var centerPanelAccess = /* link to the centerPanel */
var imageView = /* The UIImageView to add */
centerPanelAccess.addSubview(imageView)
到目前为止,这是我尝试做的事情:
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
实例?编辑:似乎不建议从其他视图内部访问和操作视图,是否有解决此问题的方法?
最佳答案
视图不应直接通信。视图控制器应协调视图之间的活动。该视图控制器应该已经具有对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()
}
}
关于ios - 如何控制/引用具有相同父对象的其他UIView中的UIView?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45278288/