【问题标题】:UIView subclass access ViewController methods swiftUIView子类访问ViewController方法swift
【发布时间】:2017-03-11 13:37:45
【问题描述】:

在我的几个项目中,我认为在很多情况下我没有创建一个很好的结构。

这可能是一个游戏,我创建了一个由 8 * 8 个单元格组成的游戏板(想想国际象棋)。每个单元格都有一个依赖于子类 (cell.swift) 的手势识别器,游戏逻辑位于父 ViewController 中。

为了争论,假设我们想向用户显示他们触摸了哪个方块。

我已经从子类 UIView 中找到了如何做到这一点(obvs。在本示例中,在子类 UIView / cell.swift 中创建警报)

UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)

但它似乎破坏了应用程序的结构 - 但访问父 ViewController 中的操作不一样吗?解决这个问题的最佳方法是什么>

【问题讨论】:

    标签: ios swift model-view-controller


    【解决方案1】:

    您的 rootViewController 是堆栈底部的 VC。这不是访问可见 VC 的安全方法,而且通常很少有用(有一些情况,但我怀疑您的应用会发现它们有用)。

    您可能想要使用的是委托模式。假设显示您的棋盘的父 VC(我们称之为 MyBoardViewController)符合如下协议。 MyView 是您用于棋盘的任何自定义 UIView 类:

    protocol SquareAlertHandler {
        func handleSquarePressed(sender : myView)
    }
    

    并将以下属性添加到您的 MyView 类中:

    weak var delegate : SquareAlertHandler?
    

    并将您当前使用的任何事件处理程序替换为以下内容(我假设您在 IB 中使用 UIButton 来处理新闻,并任意将出口命名为“didPress:”):

    @IBAction didPress(sender : UIButton) {
        delegate?.handleSquarePressed(self)
    }
    

    现在,将协议添加到您的 MyBoardViewController,并定义方法:

    class MyBoardViewController : UIViewController, SquareAlertHandler {
    
        ... ... ...
        func handleSquarePressed(sender : myView) {
            // Do something to handle the press, here, like alert the user
        }
        ... ... ...
    }
    

    最后,无论您在何处创建 MyView 实例,都将 MyBoardViewController 实例分配为委托,然后就可以开始了。

    根据您的 Swift 读写能力,这可能会让人感到困惑。添加代码,这样我至少可以匹配类名,这将有助于澄清事情。

    【讨论】:

    • 这很好,我了解协议和委托,我认为将其作为一般答案可能对其他读者有用。谢谢 - 只是学习,实际上很难找到涵盖此类(不是很琐碎)问题的任何资源。
    • 听起来不错!当您经常更改语言或对一种语言不熟悉时,编码模式会很困难。祝你好运,一切顺利。
    • 一个问题 - 我以前使用过委托并且总是设置委托。在这里它似乎总是为零 - 发生了什么?
    • 线弱 var 委托:SquareAlertHandler?将委托声明为 Optional,但不分配它。在 Swift 中将属性声明为 Optionals 是一个很好的(但不是通用的)经验法则,原因我不会深入探讨。为了访问委托,您必须首先明确设置它。类似于:myViewInstance.delegate = self,如果您在父 VC 中创建这些视图。
    • 是的,我知道了。继续国际象棋的想法,我会为每个人创建一个新的单元格。所以每个单元格都需要用 myViewInstance.delegate = self 实例化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多