【问题标题】:Change IBOutlet button's type更改 IBOutlet 按钮的类型
【发布时间】:2020-04-14 18:46:53
【问题描述】:

我正在尝试实现一些我不确定是否可行的事情。我有一个 UITableViewCell 的 xib,其中有一个 UIButton,并在情节提要中分配了自定义类,即 MainButtonSuperClass。在UITableViewCell.swift 出口连接如下,

@IBOutlet weak var button: MainButtonSuperClass!

许多不同的控制器正在配置这个TableViewCell,但按钮的 UI 对于所有在子类中定义的控制器都会有所不同,即

    final class MainButtonSubClass: MainButtonSuperClass {
        override func configure(){//different style of button }
    }

我怎样才能做到这一点?到目前为止,我已经尝试过,

let button: MainButtonSuperClass =  MainButtonSubClass()
button.configure()
cell.button = button

但这并没有选择风格

编辑:

//tableview cell
class TableViewCell: UITableViewCell {
    @IBOutlet weak var button: MainButtonSuperClass!
}

//Controller A wants default style of superclass (MainButtonSuperClass)
func configureButton(buttonCell: TableViewCell) {        
    buttonCell.button.configure() //works
}

//Controller B wants different style of subclass (MainButtonSubClass)
func configureButton(buttonCell: TableViewCell) {        
    let button: MainButtonSuperClass =  MainButtonSubClass()
    button.configure()
    cell.button = button // doesn't work or adopts the style
}


//Custom button's classes
final class MainButtonSuperClass: UIButton {
     override func configure(){//styled button }
}

final class MainButtonSubClass: MainButtonSuperClass {
     override func configure(){//different style of button }
}

【问题讨论】:

  • 您是否尝试根据正在使用的控制器更改按钮的外观?
  • 是的,不同的控制器正在配置这个TableViewCell,但它们都有不同的按钮样式。假设TableViewController Foo 想要单元格蓝色按钮TableViewController 酒吧想要带有黑色按钮的单元格。我的UIButton 的超类是蓝色的,子类是黑色的,IBOutlet 是超类的例子,但是其他控制器如何将其更改为子类
  • @jay 我已经用更多代码更新了我的问题,如果它可以清除它。谢谢

标签: swift uitableview subclass iboutlet


【解决方案1】:

好的明白,我们试试这个

类 CustomClass: UIButton {

class Type1Class: UIButton {
    // Do all the setup here

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class Type2Class: UIButton {
    // Do all the setup here

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

}

然后你可以用下面的方法来初始化它:

@IBOutlet weak var button: CustomClass.Type1Class!

希望对你有帮助!

【讨论】:

  • 我想要具体的类类型,不想通过 switch 改变它们
  • 当前TableViewCell 中的引用是@IBOutlet weak var button: MainButtonSuperClass!,所以默认样式将是MainButtonSuperClass 中定义的任何样式,一些控制器想要子类中定义的样式
  • 对不起,我起初误解了答案,但我正在做类似的事情,问题是我的按钮是 IBOutlet 当你初始化它时,let button = CustomClass.Type2Class() 然后iboutlet_button = button 它不适应更改
  • 如果我错了,请纠正我,但这将如何运作?您正在设置在控制器 A 中配置的 tableviewcell 内的按钮 CustomClass.Type1Class! 的类型,它需要 type1class 的样式并且可以正常工作,但控制器 b 也在配置此单元格并需要 CustomClass.Type2Class! 的样式
  • 是的,我想是的
【解决方案2】:

我找到了解决方案。我不会使用 IBOutlet 而只是 UIButton 的一个属性,我将使用工厂方法动态更改它。使用 IBOutlet 是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多