簡體   English   中英

UIView子類訪問ViewController方法swift

[英]UIView subclass access ViewController methods swift

在我的幾個項目中,我認為在很多情況下我並沒有創造出一個很好的結構。

可能是在我用8 * 8格的網格創建游戲板(想象棋)的游戲中。 每個單元格都有一個依賴於子類(cell.swift)的手勢識別器,游戲邏輯位於父ViewController中。

為了論證,讓我們說我們想向用戶顯示他們觸摸了哪個正方形。

我已經從子類UIView中找到了解決方法(在本示例中,obvs。在子類UIView / cell.swift中創建了警報)

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

但這似乎破壞了應用程序的結構-但是在父級ViewController中訪問動作不是一樣嗎? 解決此問題的最佳方法是什么?

您的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讀寫能力,這可能會造成混淆。 添加代碼,以便至少可以與類名匹配,這將有助於澄清問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM