我有一个带有TableView和一个按钮(大按钮)的UIView。 TableView有一个自定义的Cell。在此单元格中有一个“添加”按钮。我想在用户单击“添加”按钮时为第一个按钮设置动画。
这是我的架构:
这是我的代码:
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,但应用程序崩溃了
答案 0 :(得分:0)
向您的单元格添加块属性,以便在单击它们时通知您的视图控制器。在视图控制器块代码中,您可以访问大按钮。
请参阅我对类似问题的回答。只需用按钮更换开关示例即可。所以用UIButton代替UISwitch。
How can I get index path of cell on switch change event in section based table view
因此,不要让单元格尝试与另一个单元格/按钮对话,让单元格通知控制器,然后控制器可以管理大按钮的变化。
答案 1 :(得分:0)
虽然我对使用替代方法发表了评论,但您也可以根据对当前视图控制器类中存储的属性的更新来采用以下策略。您也可以在ProductsViewController上使用属性观察,但我认为您希望保持OOP的重点并减小控制器的大小。
对ViewController进行子类化
可以对现有的UIViewController进行子类化,然后在超类中创建一个属性来处理已更改的值(行抽头)。在那个子类中,你可以做一些动画。因为您将进行子类化,所以您将继续获得现有控制器中定义的所有好处和方法。在您的身份检查器中,将您的类指向新的子类,并使用动画为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 ...方法时,只需将值设置为inheritedProperty即可。然后添加属性观察器(请参阅示例代码)并在属性更改时做出反应(可能会传递对要设置动画的视图的引用)。
例如:在属性观察者中,您可以获取该视图并将其传递给动画师函数(无论动画是什么)。关于如何设置视图动画以便只搜索(UIView动画,UIDynamics等)的例子很多。
分离的正常好处是封装功能和重用,但Swift还保证每组属性观察者都将独立激发。你必须更多地考虑它在这个用例中的适用性。
答案 2 :(得分:0)
在
中执行所有这些操作viewController
将目标方法添加到
cellForRowAtIndexPath
方法中的单元格添加按钮 喜欢这个
cell.add.addTarget(self, action: "addProduct:", forControlEvents: UIControlEvents.TouchUpInside)
定义方法
func addProduct(button:UIButton)
{
// do button animation here
}