【问题标题】:Swift - Access IBOutlet in other classSwift - 在其他类中访问 IBOutlet
【发布时间】:2015-03-19 01:16:16
【问题描述】:

我有一个带有 TableView 和一个按钮(大按钮)的 UIView。 TableView 有一个自定义单元格。在此单元格中有一个“添加”按钮。当用户单击“添加”按钮时,我想为第一个按钮设置动画。

这是我的架构:

这是我的代码:

class ProductsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    @IBOutlet var bigButton: UIButton! <- I WANT TO ANIMATE THAT BUTTON

}

ProductCell 类

class ProductCell: UITableViewCell {

    @IBAction func addProduct(sender: AnyObject) {
       //I WANT TO ACCESS THE BIG BUTTON FROM HERE
    }
}

我的应用的屏幕示例

我尝试让父控制器或超级视图获取 IBOutlet,但应用程序总是崩溃

【问题讨论】:

  • 为什么投反对票?我是 swift 的菜鸟...
  • 为什么不直接在 didSelectCell... 范式中使用 NSNotification?或一些自定义委托...... SO上有大量示例。 Swift (willSet, et al) 中有一个叫做属性观察的东西,但我认为它不适用于你的情况。您可以尝试使用 UIDynamics 或 UIView 动画的手势识别器(全部在 SO)

标签: ios xcode uitableview swift


【解决方案1】:

将块属性添加到您的单元格中,以便在单击它们时通知您的视图控制器。在您的视图控制器块代码中,您可以访问大按钮。

查看我对类似问题的回答。只需用您的按钮替换开关示例。所以用 UIButton 替换 UISwitch。

How can I get index path of cell on switch change event in section based table view

因此,与其让单元尝试与另一个单元/按钮对话,不如让单元通知控制器,然后控制器可以管理大按钮的更改。

【讨论】:

    【解决方案2】:

    虽然我对使用替代方法发表了评论,但您也可以根据对存储在当前视图控制器类中的属性的更新来采用以下策略。您也可以在 ProductsViewController 上使用属性观察,但我假设您希望专注于 OOP 并减小控制器的大小。

    子类化 ViewController

    可以将现有的 UIViewController 子类化,然后在超类中创建一个属性来处理已更改的值(点击行)。在那个子类中,你可以做一些动画。因为您将继承子类,所以您将继续获得现有控制器中定义的所有好处和方法。在您的身份检查器中,将您的 Class 指向新的子类,并使用动画为您的 UI 创建任何功能更新。

    class ProductsViewController:... {
        var inheritedProperty:UIView = targetView {
            willSet {newValue } // is the newValue
            didSet {oldValue} //is the old value
        }
    }
    
    class AnimatedProductsViewController:ProductsViewController {
    
        override var inheritedProperty:UIView {
            //do something interesting if the property of super class changed
            willSet {newValue } // is the newValue
            didSet {oldValue} //is the old value
            //you might want to call this method like so
            // didSet { animate(newValue) }
        }
    
        func animate (view: UIView){
    
            //do animation routine using UIView animation, UIDynamics, etc.
    
        }
    }
    

    物业观察

    每当调用 didSelectCell... 方法时,只需为继承的属性设置一个值。然后添加属性观察者(参见示例代码)并在属性更改时做出反应(可能传递对您想要动画的视图的引用)。

    例如:在属性观察器中,您可以只获取该视图并将其传递给您的动画器函数(无论要执行动画的什么)。有很多关于如何为视图设置动画的示例,因此只需搜索(UIView 动画、UIDynamics 等)。

    分离的正常好处是封装功能和重用,但 Swift 还保证每组属性观察器将独立触发。关于它在这个用例中的适用性,您必须多考虑一下。

    【讨论】:

      【解决方案3】:

      在你的viewController中做所有这些事情

      cellForRowAtIndexPath方法中将目标方法添加到单元格的添加按钮 像这样

      cell.add.addTarget(self, action: "addProduct:", forControlEvents: UIControlEvents.TouchUpInside)
      

      定义方法

      func addProduct(button:UIButton)
      {
      // do button animation here
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        相关资源
        最近更新 更多