我目前正在构建一个页面上只有一个UIScrollView的应用程序,其中将包含3个UIViews。三个UIViewsleftPanelcenterPanelrightPanelleftPanel占屏幕宽度的30%,centerPanel占屏幕宽度的70%,rightPanel占屏幕宽度的30%。默认情况下,显示leftPanelcenterPanel,并且当用户从右向左滑动时,leftPanel从左侧移出,而rightPanel从右侧移入。中央面板从右侧向左侧移动。因此leftPanelcenterPanelrightPanel都具有相同的超级视图,即屏幕上的UIScrollView。我打算在rightView内有一个按钮,单击后将使centerPanel中的UIImageView出现在底部。如何通过centerPanelUIButton上的操作控制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实例?

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

最佳答案

视图不应直接通信。视图控制器应协调视图之间的活动。该视图控制器应该已经具有对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()
    }
}

关于ios - 如何控制/引用具有相同父对象的其他UIView中的UIView?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45278288/

10-10 22:39