【问题标题】:Initializers of a Class Extending UICollectionView (Swift 3.2)扩展 UICollectionView 的类的初始化器(Swift 3.2)
【发布时间】:2018-06-21 11:31:26
【问题描述】:

我正在使用 Swift 3.2 进行编码。我有一个名为EventCollectionView 的类扩展UICollectionView。此类的一个实例是一个“事件”,我想用三个 UIImage、显示事件照片的图像、事件信息和事件门票来初始化它。

但是,当我尝试在自定义初始化程序中调用 super.init() 时,我收到一条错误消息,提示“必须调用超类 UICollectionView 的指定初始化程序。”我已经尝试实现super.init(frame:CGRect),但这似乎也不起作用。

下面是我的EventCollectionView 课程的第一部分。

var eventPhoto: UIImage?
var eventInfo: UIImage?
var eventTickets: UIImage?

//Initializers
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

init?(eventPhoto: UIImage?, eventInfo: UIImage?, eventTickets: UIImage?) {
    super.init()       //Where the error occurs
    self.eventPhoto = eventPhoto
    self.eventInfo = eventInfo
    self.eventTickets = eventTickets

任何见解将不胜感激。

【问题讨论】:

  • 你打算以编程方式还是通过storyboard/xib初始化EventCollectionView
  • @AndreaMugnaini 通过故事板

标签: swift collectionview initializer


【解决方案1】:

因此,如果您想通过情节提要初始化此类 EventCollectionView,您应该以另一种方式注入这些参数,例如:

class EventCollectionView:UICollectionView {
  var eventPhoto: UIImage?
  var eventInfo: UIImage?
  var eventTickets: UIImage?

  func setup(eventPhoto: UIImage?, eventInfo: UIImage?, eventTickets: UIImage?) {
    self.eventPhoto = eventPhoto
    self.eventInfo = eventInfo
    self.eventTickets = eventTickets
  }
}

那么你应该在初始化之后随时调用setup,例如:

import UIKit

class YourViewController: UIViewController {
  @IBOutlet var collectionView:EventCollectionView!

  override func viewDidLoad() {
    super.viewDidLoad()

    // setup whatever here:
    let photo:UIImage? = nil
    let info:UIImage? = nil
    let tickets:UIImage? = nil
    collectionView.setup(eventPhoto: photo, eventInfo: info, eventTickets: tickets)
  }
}

【讨论】:

  • 非常感谢,这更有意义!
【解决方案2】:

Apple developer documents 看来,适当的init 方法签名应该是:init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout)。例如,您的 init 方法可能变为:

init?(eventPhoto: UIImage?, eventInfo: UIImage?, eventTickets: UIImage?) {

    let flowLayout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    let collectionViewFrame:CGRect = CGRect(x: 0, y: 0, width: 200, height: 200)

    super.init(frame: collectionViewFrame, collectionViewLayout: flowLayout)  
    ...
}

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多