my VC has no initializers

399 views Asked by At

When I had XCode 6.1 everything worked well. After having XCOde 6.3 I am having problem with delegate methods.

Before:

protocol MainPageLoaderViewControllerDelegate{
    func changeCategoryOfSingelTopicViewController(category: Int!)
}

class MainPageLoaderViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UIGestureRecognizerDelegate {

    var delegate: MainPageLoaderViewControllerDelegate?

    var categoryOfSingleTopic: Int! = 0 {
        didSet{        
            delegate?.changeCategoryOfSingelTopicViewController(categoryOfSingleTopic!)   
        }
    }    
}

Now, Complier gives me error saying that MainPageLoaderViewController has no initializers. How should I declare delegate var?

The all code:

import UIKit

protocol MainPageLoaderViewControllerDelegate{
    func changeCategoryOfSingelTopicViewController(category: Int!)
}
class MainPageLoaderViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UIGestureRecognizerDelegate {


var delegate: MainPageLoaderViewControllerDelegate?

var categoryOfSingleTopic: Int! = 0{
    didSet{
        // put to the right column on pageviewcontroller
        movePageContentToViewControllerAtIndex(1)
        println("here is single topic \(categoryOfSingleTopic)")
        delegate?.changeCategoryOfSingelTopicViewController(categoryOfSingleTopic!)
        changeADVControleItemsName(categoryOfSingleTopic)
    }
}


let gestureRecognizerOfMainPageController: UIPanGestureRecognizer!

@IBOutlet var scrollContentView: UIView!

@IBOutlet var segmentControl: ADVSegmentedControl!

let transtionManger = TransitionManger()

var pageIndexTest: Int!

@IBOutlet var scrollView: UIScrollView!
var mainPageViewController : UIPageViewController!

var tableViewControllers = [UITableViewController]()
var newsLenta: UITableViewController!
var mainPage: SingleTopicTableViewController!
var onlinetranslation: UITableViewController!



  var identifiers:NSArray = ["MainPageContentViewController", "MainPageTableViewController", "SingleTopicTableViewController"]



var pageContentViewController: UITableViewController!

override func viewDidLoad() {
    super.viewDidLoad()




           // self.scrollView.scrollEnabled = false
    self.transtionManger.sourceViewController = self

    CommonFunctions.setBackgroundImageToNavBar(self.navigationItem)

    println("view did load of page controller loaded")

    segmentControl.thumbColor = Design.setColorGrey20()

    createArrayOfControllers()

    resetToMainPage(1)

    segmentControl.items = ["Лента", "Главная", "Онлайн"]
    segmentControl.font = UIFont(name: "Avenir-Black", size: 12)
    segmentControl.borderColor = UIColor(white: 1.0, alpha: 0.3)
    segmentControl.selectedIndex = 1
    segmentControl.selectedLabelColor = UIColor.whiteColor()


    setGestureRecognizerToTableView()
    self.transtionManger.segmentToSetInteraction = segmentControl





   scrollContentView.addGestureRecognizer(transtionManger.exitPanGesture)
   segmentControl.addTarget(self, action: "selectPageIndexBySegmentControl", forControlEvents: UIControlEvents.ValueChanged)

}

func changeADVControleItemsName(category:Int){

    switch category{
    case 0: segmentControl.items[1] = "Главная" // main
    case 100: segmentControl.items[1] = "Избранные" // saved
    case 1: segmentControl.items[1] = "Экономика" // economy
    case 2: segmentControl.items[1] = "Политика"  // politics
    case 4: segmentControl.items[1] = "Общество"  // community
    case 5: segmentControl.items[1] = "Спорт"  // sport
    case 6: segmentControl.items[1] = "Культура"  // culture
    case 8: segmentControl.items[1] = "Проишествия" // events
    case 10: segmentControl.items[1] = "Авто"  // auto
    case 11: segmentControl.items[1] = "Фото"  // photo
    case 12: segmentControl.items[1] = "Видео"  // video
    default: break

    }

}

func changeCategoryOfSingelTopicViewController(category: Int!){

}

func setGestureRecognizerToTableView(){
    self.transtionManger.tableViewFromSourceView = self.viewControllerAtIndex(segmentControl.selectedIndex) // we do it in order to disable table view until the menu is opened

}

func movePageContentToViewControllerAtIndex(index: Int){

    switch index {
    case 0:
        println("zero index were selected")
        pageContentViewController = self.viewControllerAtIndex(index)

        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward , animated: true, completion: nil)

        setGestureRecognizerToTableView()
        setExitPaGestureAtViewControllerWithIndex(segmentControl.selectedIndex)
       // segmentControl.selectedIndex = index
    case 1:
        println("first element were selected")
        pageContentViewController = self.viewControllerAtIndex(index)

        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)

        setGestureRecognizerToTableView()
        setExitPaGestureAtViewControllerWithIndex(segmentControl.selectedIndex)
           segmentControl.selectedIndex = index
    case 2:
        println("second element were selected")

        pageContentViewController = self.viewControllerAtIndex(index)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)

        setGestureRecognizerToTableView()
        setExitPaGestureAtViewControllerWithIndex(segmentControl.selectedIndex)
    default: break
    }

}

func selectPageIndexBySegmentControl(){

    switch segmentControl.selectedIndex {
    case 0:
      movePageContentToViewControllerAtIndex(0)
    case 1:
       movePageContentToViewControllerAtIndex(1)
    case 2:
        movePageContentToViewControllerAtIndex(2)
    default:
        break
    }

}



@IBAction func showOrCloseMenu(sender: AnyObject) {
    if transtionManger.isMenuVisible == true {
        println("it is true")
        transtionManger.isMenuVisible = false

        transtionManger.menuViewController.performSegueWithIdentifier("dismisMenu", sender: nil)
    }
    else{
        println("it is false")
        performSegueWithIdentifier("showMenu", sender: nil)
    }
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let menu = segue.destinationViewController as! SideBarMenuTableViewController

    if transtionManger.isMenuVisible == true {
        transtionManger.presentingP = false
    }

    menu.transitioningDelegate = self.transtionManger

    // add in order to set menuviewcontroller in transformerManager
    self.transtionManger.menuViewController = menu


}

@IBAction func unwindSegueToMainScreen(segue:UIStoryboardSegue) {
    // bug? exit segue doesn't dismiss so we do it manually...
    self.dismissViewControllerAnimated(true, completion: nil)
}

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

func createArrayOfControllers(){

    newsLenta = self.storyboard?.instantiateViewControllerWithIdentifier("NewsLentaTableViewController")as! NewsLentaTableViewController

    mainPage = self.storyboard?.instantiateViewControllerWithIdentifier("SingleTopicTableViewController") as! SingleTopicTableViewController

    self.delegate = mainPage

    onlinetranslation = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageTableViewController") as! MainPageTableViewController

    tableViewControllers = [newsLenta, mainPage, onlinetranslation]
}

func resetToMainPage(index: Int!) {
    /* Getting the page View controller */
    mainPageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageViewController") as! UIPageViewController
    self.mainPageViewController.dataSource = self
    self.mainPageViewController.delegate = self

    pageContentViewController = self.viewControllerAtIndex(index)

   // pageContentViewController.view.addGestureRecognizer(transtionManger.exitPanGesture3)
   // self.transtionManger.sourceViewController = pageContentViewController // adding swipe to the pageContentViewControlle in order to close menu
    //self.transtionManger.sourceViewController = mainPageViewController
    self.mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)


    self.mainPageViewController.view.frame = CGRectMake(0, 102, self.view.frame.width, self.view.frame.height)
    self.addChildViewController(mainPageViewController)
    self.view.addSubview(mainPageViewController.view)
    self.mainPageViewController.didMoveToParentViewController(self)

}

func viewControllerAtIndex(index : Int) -> UITableViewController? {

    if index > 2 || index < 0 {
        return nil
    }


    return tableViewControllers[index]
}

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

    var index:Int!

    if viewController.isKindOfClass(NewsLentaTableViewController) {

        index = (viewController as! NewsLentaTableViewController).pageIndex

    }else if viewController.isKindOfClass(MainPageTableViewController) {

       index = (viewController as! MainPageTableViewController).pageIndex

    }else if viewController.isKindOfClass(SingleTopicTableViewController) {

        index = (viewController as! SingleTopicTableViewController).pageIndex


    }else {return nil}

    if index == 2 {

        return nil

    }

    index = index + 1

    return self.viewControllerAtIndex(index)
}


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

    var index:Int!

    if viewController.isKindOfClass(NewsLentaTableViewController) {

        index = (viewController as! NewsLentaTableViewController).pageIndex

    }else if viewController.isKindOfClass(MainPageTableViewController) {

        index = (viewController as! MainPageTableViewController).pageIndex


    }else if viewController.isKindOfClass(SingleTopicTableViewController) {

        index = (viewController as! SingleTopicTableViewController).pageIndex

    }else {return nil}

    if index == 0 {
        return nil
    }
    index = index - 1

    return self.viewControllerAtIndex(index)

}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int
{
    return 2
}

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

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [AnyObject], transitionCompleted completed: Bool) {
    if completed && finished {
        var index = previousViewControllers.startIndex

        segmentControl.selectedIndex = thePageIndex
        // add exit3 gesture recognizer to the current index
        setExitPaGestureAtViewControllerWithIndex(segmentControl.selectedIndex)
        setGestureRecognizerToTableView()
         //selectedLabelFrame
        //setContentOffSetOfUIScrollView()
    }
}

override func viewDidAppear(animated: Bool) {
     //setContentOffSetOfUIScrollView() // in the first load of view you need to set segment scroll
    setExitPaGestureAtViewControllerWithIndex(segmentControl.selectedIndex)

}

func setExitPaGestureAtViewControllerWithIndex(index: Int!){

    self.viewControllerAtIndex(index)?.tableView.addGestureRecognizer(transtionManger.exitPanGesture3)
}


func setContentOffSetOfUIScrollView(){
    println(segmentControl.items.count - 1)
    if thePageIndex == 0 {

        scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
        return
    }else if thePageIndex == segmentControl.items.count - 1{
        if selectedLabelFrame.frame.origin.x + selectedLabelFrame.frame.width > self.view.frame.width {

            var sum = selectedLabelFrame.frame.origin.x + selectedLabelFrame.frame.width
            var scroll = sum - self.view.frame.width
            scrollView.setContentOffset(CGPointMake(scroll, 0), animated: true)
            return
        }else {
            var sum = selectedLabelFrame.frame.origin.x + selectedLabelFrame.frame.width
            var scroll = self.view.frame.width - sum
            scrollView.setContentOffset(CGPointMake(scroll, 0), animated: true)
            return
        }
    }

    if selectedLabelFrame.frame.origin.x + selectedLabelFrame.frame.width  > self.view.frame.width / 2 {
        println(selectedLabelFrame.frame.origin.x)
        println(selectedLabelFrame.frame.width)
        println(self.view.frame.width)
        println("more")
        if thePageIndex == 1 {

            var averageWidth = selectedLabelFrame.frame.width/2
            var sum = selectedLabelFrame.frame.origin.x + averageWidth
            var scroll = sum - self.view.frame.width/2
            println("scroll is \(scroll)")
            scrollView.setContentOffset(CGPointMake(scroll, 0), animated: true)

        }
    }else{
        println(selectedLabelFrame.frame.origin.x)
        println(selectedLabelFrame.frame.width)
        println(self.view.frame.width)
        println("less")
        if thePageIndex == 1 {

            var averageWidth = selectedLabelFrame.frame.width/2
            var sum = selectedLabelFrame.frame.origin.x + averageWidth
            var scroll = self.view.frame.width/2 - sum
            println("scroll is \(scroll)")
            scrollView.setContentOffset(CGPointMake(scroll, 0), animated: true)

        }
    }

}

}

3

There are 3 answers

1
Yestay Muratov On

I solved the problem but still dont understand how it is related to the problem "VC has not initilizers"

I changed the code:

var gestureRecognizerOfMainPageController: UIPanGestureRecognizer!

to

var gestureRecognizerOfMainPageController: UIPanGestureRecognizer?
6
cmyr On

In Swift, all instance variables have to be initialized at init (see the documentation) . Before you added the delegate, your superview's initializer was being called (because you hadn't overridden it) and you hadn't added any new instance variables, so this was fine. Now, however, your superview's implementation is being called but it is not initializing your variable, which is a compiler error.

Two options:

1) just initialize in your declaration: var delegate: MainPageLoaderViewControllerDelegate? = nil 2) override init and initialize your variable there.

1
lostInTransit On

You need to have a setter method for your variable

var delegate: MainPageLoaderViewControllerDelegate? {
    didSet {
        // Do whatever changes you wish to do
    }
}

or have an init which instantiates the variable with an initial value, or initialize the variable with a value where you declare it.