类'ProductDetailViewController'没有初始化器

类'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) 
    } 

} 
+1

更改var zoomScroll:UIScrollView到var zoomScroll:UIScrollView! –

+0

您还需要初始化zoomScoll变量或将其声明为可选,如var zoomScroll:UIScrollView ?.类ProductDetailViewController没有初始化器意味着一个非可选变量没有被初始化。 –

+0

它的工作,你能告诉我更多关于这个问题并修复。 – vijeesh

@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 
} 

我希望这会有所帮助。