Swift,协议和变量值未存储...?

Swift, protocol and variable values not stored...?

我是协议和页面浏览控制器的新手,我尝试了一些我希望很简单的事情。将内容 viewcontroller 中的变量值传递给页面列表 viewcontroller 但它不起作用,所以我做错了什么...

在我的故事板中,我有一个 ViewController(作为页面列表 viewcontroller)并嵌入在导航控制器中。导航栏上有一个按钮。

有一个带有标签的 PageContentViewController。

我使用的代码如下(使用@Tom Elliott 提供的公认解决方案进行编辑):

protocol setRoomOnScreenProtocol {
    func updateRoomOnScreen(myRoom: String)
}

class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, setRoomOnScreenProtocol {

@IBAction func press1(sender: AnyObject) {

    println("roomOnScreen: \(roomOnScreen)")
    println("pageTitles: \(pageTitles)")
}

@IBOutlet weak var btn1: UIBarButtonItem!
let pageTitles = ["Room 1", "Room 2", "Room 3", "Room 4"]
var count = 0

var pageViewController : UIPageViewController!

var roomOnScreen: String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    reset()
}

func updateRoomOnScreen(myRoom: String) {

    roomOnScreen = myRoom
    println("roomOnScreen (PGL): \(roomOnScreen)")
}

func reset() {
    /* Getting the page View controller */
    pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
    self.pageViewController.dataSource = self

    let pageContentViewController = self.viewControllerAtIndex(0)

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

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

}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    var index = (viewController as! PageContentViewController).pageIndex!

    index++

    return self.viewControllerAtIndex(index)

}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    var index = (viewController as! PageContentViewController).pageIndex!

    if (index <= 0) {
        return nil
    }

    index--

    return self.viewControllerAtIndex(index)

}

func viewControllerAtIndex(index : Int) -> UIViewController? {
    if ((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) {
        return nil
    }

    let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController

    pageContentViewController.delegate = self

    pageContentViewController.titleText = self.pageTitles[index]
    pageContentViewController.pageIndex = index

    return pageContentViewController
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {

    return pageTitles.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {

    return 0
}

}

和 PageContentViewController:

class PageContentViewController: UIViewController {

    var pageIndex: Int?
    var titleText : String!

    var delegate: setRoomOnScreenProtocol!

    @IBOutlet weak var label1: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()

        self.label1.text = self.titleText

    }

    override func viewDidAppear(animated: Bool) {

        if let actualDelegate = self.delegate {
            actualDelegate.updateRoomOnScreen(titleText)
        } else {
            println("error")
        }

        doMore()
    }

    func doMore() {

        println("showing...:\(titleText)")
    }


}

当我浏览页面时,我正确地得到了输出:

roomOnScreen (PGL): Room 1
showing...:Room 1
roomOnScreen (PGL): Room 2
showing...:Room 2

但是当我点击导航栏按钮时,我没有得到任何值...

roomOnScreen:
pageTitles: [Room 1, Room 2, Room 3, Room 4]

我做错了什么...?

谢谢!

行:

self.delegate = ViewController()

实际上是在每次调用时创建一个全新的ViewController实例,所以可见的原始ViewController没有收到消息。

我建议您在最初创建页面时设置委托:

let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
pageContentViewController.delegate = self