UIView子类访问ViewController方法swift

时间:2017-03-11 13:37:46

标签: ios swift model-view-controller

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

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

为了论证,让我们说我们想向用户显示他们触摸过哪个方格。

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

body

但似乎打破了应用程序的结构 - 但是在父ViewController中访问动作是不是一样?接近这个>

的最佳方法是什么

1 个答案:

答案 0 :(得分: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识字率,这可能会令人困惑。添加代码,以便我至少可以匹配类名,这将有助于澄清事情。