gpt4 book ai didi

swift - 我的 VC 没有初始化器

转载 作者:行者123 更新时间:2023-11-28 11:17:26 26 4
gpt4 key购买 nike

当我使用 XCode 6.1 时,一切都运行良好。在拥有 XCOde 6.3 之后,我遇到了委托(delegate)方法的问题。

之前:

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

class MainPageLoaderViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UIGestureRecognizerDelegate {

var delegate: MainPageLoaderViewControllerDelegate?

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

现在,Complier 提示我 MainPageLoaderViewController 没有初始值设定项。我应该如何声明委托(delegate)变量?

全部代码:

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)

}
}

}

最佳答案

在 Swift 中,所有实例变量都必须在 init 中初始化(参见 documentation)。在您添加 delegate 之前,您的 superview 的初始化器被调用(因为您没有覆盖它)并且您没有添加任何新的实例变量,所以这很好。然而,现在正在调用您的 superview 的实现,但它没有初始化您的变量,这是一个编译器错误。

两种选择:

1) 只需在声明中初始化:var delegate: MainPageLoaderViewControllerDelegate? = 无 2) 覆盖 init 并在那里初始化你的变量。

关于swift - 我的 VC 没有初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30845211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com