2015-07-06 13 views
16

Próbowałem utworzyć ekran samouczka w mojej aplikacji na iOS, gdzie użytkownik przesuwa się obok kilku zdjęć, aby dowiedzieć się trochę o wspomniana aplikacja. Wszystko wygląda w porządku, z wyjątkiem gdy budować mojego projektu, pojawia się następujący błąd na pierwszej linii kodu:Nie mogę ustalić, dlaczego otrzymuję komunikat "Klasa ViewController nie ma inicjalizacji" Błąd w kodzie Swift iOS

Klasa ViewController ma inicjatorów

Co zrobiłem źle?

kod

My ViewController.swift jest poniżej

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

Alše zobaczyć [Klasa ma inicjatorów Swift] (https://stackoverflow.com/questions/27797351/class-has-no-initializers-swift?noredirect=1&lq=1) – Honey

Odpowiedz

30

To z powodu tej linii:

var pageViewController: UIPageViewController 

Mówisz, że pageViewController nie może być null, ale nie masz inicjator że ustawia ją na wartość. Patrząc na kod, podejrzewam chcesz zmienić go na to:

var pageViewController: UIPageViewController! 

I went into more detail on this problem here.

+1

dziękuję! Teraz działa! –

+0

Nie ma za co. Nie zapomnij: jeśli oznaczysz odpowiedź jako poprawną, pomoże ona również innym osobom. – TwoStraws

+0

Miałem zamiar ale StackOverflow kazał mi poczekać kilka minut :) –

7

W Swift klasie każdy non-opcjonalne zmienna zadeklarowana muszą być inicjowane w jednej z podanych metod startowych.

W twoim przypadku, to ta zmienna

var pageViewController: UIPageViewController 

uznaniu jej jako niejawna rozpakowany opcja jak dwóch innych zmiennych, ponieważ zmienna jest gwarantowana być ustawiony przed nim używany.

var pageViewController: UIPageViewController! 
+0

Dziękuję bardzo! Zadziałało! –

Powiązane problemy