如何在 Swift 5 中创建一个继承自另一个类的 UIImageView 类

Posted

技术标签:

【中文标题】如何在 Swift 5 中创建一个继承自另一个类的 UIImageView 类【英文标题】:How to create a UIImageView class that inherits from another class in Swift 5 【发布时间】:2020-01-24 21:29:19 【问题描述】:

我试图弄清楚如何创建一个自定义 UIImagView 类,该类继承另一个类的函数,例如默认 UIViewController 类。

代码:

extension ViewController 
  class CustomClass: UIImageView 

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

        TestFunction()
    
  


class ViewController: UIViewController 
  override func viewDidLoad() 
    super.viewDidLoad()
  

  func TestFunction() 
    print("Hello")
  

我需要能够在不执行类似 ViewController().TestFucntion() 的情况下访问名为 TestFucntion() 的函数 我希望能够简单地调用函数,例如:TestFucntion() 但部分我遇到的问题是 我需要 CustomClass 成为 UIImageView 类

当你尝试从你的新自定义类调用 TestFunction() 时,它会给你这个错误:

实例成员“TestFunction”不能用于“ViewController”类型;您的意思是改用这种类型的值吗?

所以基本上在一天结束时,我们需要自定义 UIImageView 类能够直接访问父 UIViewController 类中的函数,只需调用 TestFunction() 而不是 ViewController().TestFunction() 即可

【问题讨论】:

【参考方案1】:

我认为委托是在 imageView 和控制器之间耦合 testFunction() 调用的好方法。使用自定义初始化程序将计算属性添加到 viewController。像上面的代码这样的初始化程序可以调用 testFunction()

protocol TestFunction 
  func test()


class MyImageView: UIImageView 

  var delegate: TestFunction?

  init(frame: CGRect, tester: TestFunction? = nil) 
    super.init(frame: frame)
    delegate = tester
    delegate?.test()
  

  required init?(coder: NSCoder) 
    super.init(coder: coder)
  



class MyViewController: UIViewController, TestFunction  

  var imageView: MyImageView? 
    return MyImageView(frame: .zero, tester: self)
  

  func test() 
    print("test")
  


【讨论】:

如果视图是通过故事板创建的,控制器可以通过其 IBOutlet 设置委托。 我更喜欢 Phillip 谈论的方式。然后在 viewDidLoad() 中分配委托。

以上是关于如何在 Swift 5 中创建一个继承自另一个类的 UIImageView 类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中创建 UITableView 类的实例

如何在 swift 中声明一个“受保护”变量

在 Swift 4 中创建类的非零属性数组

如何在 Swift 中创建一个圆形按钮? [关闭]

继承,在 C++ 中创建子类时可以删除/忽略父类的属性吗?

我们如何检查两个类是不是继承自另一个?