在子 class 中更改子视图 class
Change subview class in subclass
假设我有一个名为自定义视图的 UITableViewCell class,带有一个 class GenericButton 按钮,该按钮已在自动布局中以编程方式定义
class View: UITableViewCell {
var button: GenericButton
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
button = GenericButton()
// blah blah blah constraints
}
}
现在假设我有一个名为 OtherView 的视图的子class,我希望该按钮成为名为 CircleButton 的 GenericButton 的子class。
class OtherView: View {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
button = CircleButton()
}
}
但是,我的视图仍然显示一个 GenericButton,而不是 CircleButton。我做错了什么?
好的,我已经考虑了几个小时,得出的结论是这可能是最佳答案。
import UIKit
class View: UITableViewCell
{
var button: GenericButton! = nil
required init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
convenience init(button: Bool, style: UITableViewCellStyle, reuseIdentifier: String?)
{
self.init(style: style, reuseIdentifier: reuseIdentifier)
if button
{
button = GenericButton()
setConstraint()
}
}
private func setConstraint()
{
// blah blah blah constraints
}
}
class OtherView: View
{
required init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
convenience init(button: Bool, style: UITableViewCellStyle, reuseIdentifier: String?)
{
self.init(style: buttonWithStyle, reuseIdentifier: reuseIdentifier)
if button
{
button = CircleButton()
setConstraint()
}
}
}
我猜你在 View
中将按钮添加到视图层次结构中。如果是这样,button = CircleButton()
就没有意义了。但是,您仍然可以通过删除 OtherView
中的按钮,然后重新添加它来实现。
class View: UITableViewCell {
var button: GenericButton
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
button = GenericButton()
addButton(button)
}
func addButton(button: UIButton) {
// add button into view hierarchy here
}
}
class OtherView: View {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
button.removeFromSuperview()
button = CircleButton()
addButton(button)
}
}
假设我有一个名为自定义视图的 UITableViewCell class,带有一个 class GenericButton 按钮,该按钮已在自动布局中以编程方式定义
class View: UITableViewCell {
var button: GenericButton
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
button = GenericButton()
// blah blah blah constraints
}
}
现在假设我有一个名为 OtherView 的视图的子class,我希望该按钮成为名为 CircleButton 的 GenericButton 的子class。
class OtherView: View {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
button = CircleButton()
}
}
但是,我的视图仍然显示一个 GenericButton,而不是 CircleButton。我做错了什么?
好的,我已经考虑了几个小时,得出的结论是这可能是最佳答案。
import UIKit
class View: UITableViewCell
{
var button: GenericButton! = nil
required init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
convenience init(button: Bool, style: UITableViewCellStyle, reuseIdentifier: String?)
{
self.init(style: style, reuseIdentifier: reuseIdentifier)
if button
{
button = GenericButton()
setConstraint()
}
}
private func setConstraint()
{
// blah blah blah constraints
}
}
class OtherView: View
{
required init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
convenience init(button: Bool, style: UITableViewCellStyle, reuseIdentifier: String?)
{
self.init(style: buttonWithStyle, reuseIdentifier: reuseIdentifier)
if button
{
button = CircleButton()
setConstraint()
}
}
}
我猜你在 View
中将按钮添加到视图层次结构中。如果是这样,button = CircleButton()
就没有意义了。但是,您仍然可以通过删除 OtherView
中的按钮,然后重新添加它来实现。
class View: UITableViewCell {
var button: GenericButton
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
button = GenericButton()
addButton(button)
}
func addButton(button: UIButton) {
// add button into view hierarchy here
}
}
class OtherView: View {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
button.removeFromSuperview()
button = CircleButton()
addButton(button)
}
}