类'ProductDetailViewController'没有初始化器
问题描述:
我正在尝试创建可滚动的imageview。目前使用swift 4.0。在运行时,我得到“没有初始化器”的错误。我不确定哪些代码带来了这个错误。我对swift很陌生,我无法跟踪发生了什么。类'ProductDetailViewController'没有初始化器
Class 'ProductDetailViewController' has no initializers
我得到这个错误。
任何人都可以告诉我如何解决这个错误。
整个视图控制器代码如下。在此先感谢
import UIKit
import SwiftyJSON
class ProductDetailViewController: UIViewController,UIScrollViewDelegate {
//Outlers
@IBOutlet weak var scrollView: UIScrollView!
//Global variables
var productDict : JSON = []
var arrayOfProductImageUrls : Array<Any> = []
var zoomScroll : UIScrollView
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.initialSetup()
self.scrollViewSetup()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
//Mark: - Scrollview Setup
func initialSetup() {
self.scrollView.delegate = self
}
func scrollViewSetup() {
let productsArray : Array = self.arrayOfProductImageUrls;
self.scrollView.backgroundColor = UIColor.white
var frame : CGRect = CGRectMake(0, 0, self.scrollView.frame.size.width, 360)
for (index, value) in productsArray.enumerated() {
//Imageview Setup
let productImageView : UIImageView
let width : NSInteger = Int(frame.width)
productImageView.frame.origin.x = CGFloat(Int (width * index))
productImageView.frame.origin.y = 0
//Scrollview Setup
zoomScroll.frame = frame;
zoomScroll.backgroundColor = UIColor.clear
zoomScroll.showsVerticalScrollIndicator = false
zoomScroll.showsHorizontalScrollIndicator = false
zoomScroll.delegate = self
zoomScroll.minimumZoomScale = 1.0
zoomScroll.maximumZoomScale = 6.0
zoomScroll.tag = index
zoomScroll.isScrollEnabled = true
self.scrollView.addSubview(zoomScroll)
//Setting image
let imageUrl : URL = (productsArray[index] as AnyObject).url
productImageView.sd_setImage(with: imageUrl)
if index < productsArray.count {
productImageView.frame = zoomScroll.bounds
productImageView.contentMode = UIViewContentMode.redraw
productImageView.clipsToBounds = true
productImageView.backgroundColor = UIColor.clear
zoomScroll.addSubview(productImageView)
}
self.scrollView.contentSize = CGSizeMake(CGFloat(frame.origin.x) + CGFloat(width), productImageView.frame.size.height)
}
}
//Mark : Custom methods
func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
return CGRect(x: x, y: y, width: width, height: height)
}
func CGSizeMake(_ width: CGFloat, _ height: CGFloat) -> CGSize {
return CGSize(width: width, height: height)
}
}
答
@Saurabh Prajapati。很好,赶上。
有关详细所述的夫特编程语言规定
类和结构必须由时间他们所有的存储属性设定为 适当的初始值,该值的类的实例或创建 结构。存储的属性不能留在 不确定状态。
您可以在 初始值设定项中设置存储属性的初始值,也可以通过将默认属性值指定为 属性定义的一部分来设置初始值。
让我来解释一下,问题出在scrollView
属性没有默认值。如上所述,Swift中的所有变量必须始终有一个值或零(使其可选)。当你将它设置为可选时,你可以默认为零,不需要明确给它赋值或初始化它。
我们使用!
可选的,所以默认值将是nil
class ViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
}
设置零为默认值
class ViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView! = nil
}
设置的默认值,现在创建一个对象这不是零。
class ViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView = UIScrollView()
}
但是我们不能这样做,我们在这里没有设置默认值。
class ViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView
}
我希望这会有所帮助。
更改var zoomScroll:UIScrollView到var zoomScroll:UIScrollView! –
您还需要初始化zoomScoll变量或将其声明为可选,如var zoomScroll:UIScrollView ?.类ProductDetailViewController没有初始化器意味着一个非可选变量没有被初始化。 –
它的工作,你能告诉我更多关于这个问题并修复。 – vijeesh