2015-07-06 8 views
16

Ich habe versucht, einen Tutorial-Bildschirm in meiner iOS App, wo der Benutzer ein paar Bilder swiped, um ein wenig über zu lernen die genannte Anwendung. Alles sieht gut aus, außer wenn ich mein Projekt erstellen, erhalte ich die folgende Fehlermeldung auf der ersten Zeile des Codes:Ich kann nicht herausfinden, warum ich bekomme "Class ViewController hat keine Initialisierer" Fehler in Swift iOS App Code

Klasse Viewcontroller hat keine initializers

Was habe ich falsch gemacht?

Mein ViewController.swift Code ist unten

import UIKit 

//line below is where I get the error 

class ViewController: UIViewController, UIPageViewControllerDataSource { 

//end 

var pageViewController: UIPageViewController 
var pageTitles: NSArray! 
var pageImages: NSArray! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.pageTitles = NSArray(objects: "", "", "") 
    self.pageImages = NSArray(objects: "page1", "page2", "page3") 

    self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! 
    UIPageViewController 

    self.pageViewController.dataSource = self 

    var startVC = self.viewControllerAtIndex(0) as ContentViewController 
    var viewControllers = NSArray(object: startVC) 

    self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil) 

    self.addChildViewController(self.pageViewController) 
    self.view.addSubview(self.pageViewController.view) 
    self.pageViewController.didMoveToParentViewController(self) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func restartAction(sender: AnyObject) { 
} 

func viewControllerAtIndex(index: Int) -> ContentViewController 
{ 

    if ((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) 
    { 
     return ContentViewController() 
    } 

    var vc: ContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as! ContentViewController 

    vc.imageFile = self.pageImages[index] as! String 
    vc.titleText = self.pageTitles[index] as! String 

    vc.pageIndex = index 

    return vc 

} 

// Mark: - Page View Controller Data Source 

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 

    var vc = viewController as! ContentViewController 
    var index = vc.pageIndex as Int 

    if (index == 0 || index == NSNotFound) 
    { 
     return nil 
    } 

    index-- 
    return self.viewControllerAtIndex(index) 

} 

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 

    var vc = viewController as! ContentViewController 
    var index = vc.pageIndex as Int 

    if (index == NSNotFound) 
    { 
     return nil 
    } 

    index++ 

    if (index == self.pageTitles.count) 
    { 
     return nil 
    } 

    return self.viewControllerAtIndex(index) 
} 

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return self.pageTitles.count 
} 

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return 0 
} 

} 
+0

Alse siehe [Klasse hat keine initializers Swift] (https://stackoverflow.com/questions/27797351/class-has-no-initializers-swift?noredirect=1&lq=1) – Honey

Antwort

30

Es ist wegen dieser Linie ist:

var pageViewController: UIPageViewController 

Sie sagen, dass pageViewController nicht null sein kann, aber Sie haben keine Initialisierungswerte, dass setzt es auf einen Wert. Mit Blick auf den Code, ich vermute, dass Sie es so weit ändern wollen:

var pageViewController: UIPageViewController! 

I went into more detail on this problem here.

+1

Thank you! Es funktioniert jetzt! –

+0

Sie sind herzlich willkommen. Vergessen Sie nicht: Wenn Sie die Antwort als richtig markieren, hilft sie auch anderen Menschen. – TwoStraws

+0

Ich ging, aber StackOverflow sagte mir, ein paar Minuten zu warten :) –

7

In einer Swift Klasse jeder Nicht-optional deklarierte Variable muss in einem der angegebenen init Methoden initialisiert werden.

In Ihrem Fall, es ist diese Variable

var pageViewController: UIPageViewController 

als implizite ungeöffneten optional wie die beiden anderen Variablen deklarieren, da die Variable garantiert gesetzt werden, bevor es verwendet wird.

var pageViewController: UIPageViewController! 
+0

Vielen Dank! Es funktionierte! –