【问题标题】:WKInterfaceTable, Row Controllers and Button actions in SwiftSwift 中的 WKInterfaceTable、行控制器和按钮操作
【发布时间】:2015-02-16 20:35:47
【问题描述】:

在尝试使用 Swift 进行 Apple Watch 开发时,我遇到了一项相当基本的任务的问题。我最近收到了似乎是 Obj C 中问题的完美答案,但我似乎无法翻译它。

我有一个接口控制器,其中包含一个表,其中包含同一行控制器的多行。每行包含两个按钮。当点击按钮时,它的背景图像会发生变化,但需要在界面控制器类中调用另一个函数,并且该函数需要访问界面控制器类中的类级变量。

表连接到接口控制器。按钮连接到行控制器类。这是我简化的 Swift 代码。感谢您的观看!

/// MY INTERFACE CLASS ///

class MainBoard: WKInterfaceController {

    @IBOutlet weak var TileGrid: WKInterfaceTable!

    let numRows = 3

    let imageNames =    ["img1","img2","img3"]

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)

        // Configure interface objects here.
        initBoard()
    }

    func initBoard() {                
        self.TileGrid.setNumberOfRows(self.numRows, withRowType: "Row")

        for var i = 0; i < numRows; i++ {

            let tmpImageA = UIImage(named: imageNames[0])
            let tmpImageB = UIImage(named: imageNames[1])

            let rowOfTiles = self.TileGrid.rowControllerAtIndex(i) as Row

            rowOfTiles.backImageA = tmpImageA
            rowOfTiles.backImageB = tmpImageB

        }        
    }

    func doSomething() {
        //this function needs to be called whenever a button is pressed
    }

}

///////MY ROW CONTROLLER CLASS ////////////////////////

class Row : NSObject {

    // At runtime these will be assigned based on the random game board creation
    var backImageA = UIImage(named: "default.png")
    var backImageB = UIImage(named: "default.png")

    @IBOutlet weak var TileA: WKInterfaceButton!
    @IBOutlet weak var TileB: WKInterfaceButton!

    @IBAction func TapTileA() {
        TileA.setBackgroundImage(backImageA)
        //NEED TO CALL FUNCTION DO SOMETHING IN INTERFACE CONTROLLER
    }

    @IBAction func TapTileB() {
        TileB.setBackgroundImage(backImageB)
        //NEED TO CALL FUNCTION DO SOMETHING IN INTERFACE CONTROLLER

    }

}

【问题讨论】:

    标签: swift apple-watch wkinterfacetable


    【解决方案1】:

    我最好的答案是在你的 RowController 类中创建一个委托,然后在你的 InterfaceController 中实现这个委托

    委托可以有方法buttonOneClickHappenedbuttonTwoClickHappened

    然后每个 RowController 都有代理作为属性,当您创建 RowControllers 时调用 setDelegate: self 其中 self 是您的 InterfaceController

    希望这会有所帮助。

    【讨论】:

    • 我想知道这个答案是否有帮助?我有类似的要求,但不知道如何实现这个答案。 @Gligor,您能否详细说明一些示例代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多