uipageviewController:如何在这段代码中找到索引?
uipageviewController : how is the index found in this code?
我不明白 indexOfVC
returns 索引:dataObject 在 ContentViewController
中是可选的:
class ContentViewController : UIViewController {
var dataObject:AnyObject?
,当我们调用 indexOfVC
时,pageContent 包含 html 个字符串。如果 dataObject 为空且 pageContent 填充有 html 文本,如何在 pageContent 中找到 dataObject?
func viewControllerAtIndex(index:Int)->ContentViewController?{
if (index < 0) || (index >= pageContent.count){
return nil
}
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var vc = storyboard.instantiateViewControllerWithIdentifier("ContentViewController") as ContentViewController
vc.dataObject = pageContent[index]
return vc
}
/* HERE */
func indexOfVC(viewController:ContentViewController) ->Int {
if let dataObject : AnyObject = viewController.dataObject {
return pageContent.indexOfObject(dataObject)
}
else {
return NSNotFound
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index : Int = indexOfVC(viewController as ContentViewController)
println("after: index: \(index)") //found 0, then 1, 2,... when scrolling right
if (index == NSNotFound) {
return nil
}
index++
return viewControllerAtIndex(index)
}
//called in viewdidload
func createContentPages(){
var pageStrings = [String]()
for i in 1...11 {
pageStrings.append(String("<html><head></head><body><br><h1>Chapter \(i)</h1><p>This is the page \(i) of content displayed using UIPageViewController in iOS 8.</p></body></html>"))
}
pageContent = pageStrings
}
代码来自:http://www.techotopia.com/index.php/An_Example_Swift_iOS_8_UIPageViewController_Application
答案是 dataObject
在调用 indexOfVC
时永远不会为零。尽管它是可选的,并且在 ContentViewController
首次初始化时将为 nil,但一旦 viewControllerAtIndex
方法创建了一个 ContentViewController,它就会将其 dataObject
设置为 pageContent
数组:
var vc = storyboard.instantiateViewControllerWithIdentifier("ContentViewController") as ContentViewController
vc.dataObject = pageContent[index]
所以整体流程是:
起始页设置在主视图控制器的viewDidLoad
:
let startingViewController: ContentViewController = viewControllerAtIndex(0)!
这将创建一个 VC 并将其 dataObject
设置为 pageContent[0]
。
如果您随后滑动,pageViewController 将调用 viewControllerAfterViewControler:viewController
。在此调用中,viewController
参数是 current 视图控制器。该方法需要知道当前 VC 的索引,因此它以 viewController
作为参数调用 indexOfVC
。
indexOfVC
读取该视图控制器的 dataObject
值,即 pageContent[0]
。因此 pageContent.indexOfObject(dataObject)
returns 是整数 0。
然后递增 (index++
),因此调用 viewControllerAtIndex
将为索引 1 创建一个新的 VC。这将创建一个新视图控制器并立即将其 dataObject
设置为 pageContent[1]。循环继续...
因此,按照当前编码,indexOfVC
从未 通过 viewController,其中 dataObject
为零。但如果它曾经是,它将 return 特殊值 NSNotFound
。然后 viewControllerAfterViewController:
检查 return 值,如果它 是 NSNotFound
,returns nil
- 它告诉页面视图控制器不允许滑动。
我不明白 indexOfVC
returns 索引:dataObject 在 ContentViewController
中是可选的:
class ContentViewController : UIViewController {
var dataObject:AnyObject?
,当我们调用 indexOfVC
时,pageContent 包含 html 个字符串。如果 dataObject 为空且 pageContent 填充有 html 文本,如何在 pageContent 中找到 dataObject?
func viewControllerAtIndex(index:Int)->ContentViewController?{
if (index < 0) || (index >= pageContent.count){
return nil
}
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var vc = storyboard.instantiateViewControllerWithIdentifier("ContentViewController") as ContentViewController
vc.dataObject = pageContent[index]
return vc
}
/* HERE */
func indexOfVC(viewController:ContentViewController) ->Int {
if let dataObject : AnyObject = viewController.dataObject {
return pageContent.indexOfObject(dataObject)
}
else {
return NSNotFound
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index : Int = indexOfVC(viewController as ContentViewController)
println("after: index: \(index)") //found 0, then 1, 2,... when scrolling right
if (index == NSNotFound) {
return nil
}
index++
return viewControllerAtIndex(index)
}
//called in viewdidload
func createContentPages(){
var pageStrings = [String]()
for i in 1...11 {
pageStrings.append(String("<html><head></head><body><br><h1>Chapter \(i)</h1><p>This is the page \(i) of content displayed using UIPageViewController in iOS 8.</p></body></html>"))
}
pageContent = pageStrings
}
代码来自:http://www.techotopia.com/index.php/An_Example_Swift_iOS_8_UIPageViewController_Application
答案是 dataObject
在调用 indexOfVC
时永远不会为零。尽管它是可选的,并且在 ContentViewController
首次初始化时将为 nil,但一旦 viewControllerAtIndex
方法创建了一个 ContentViewController,它就会将其 dataObject
设置为 pageContent
数组:
var vc = storyboard.instantiateViewControllerWithIdentifier("ContentViewController") as ContentViewController
vc.dataObject = pageContent[index]
所以整体流程是:
起始页设置在主视图控制器的
viewDidLoad
:let startingViewController: ContentViewController = viewControllerAtIndex(0)!
这将创建一个 VC 并将其
dataObject
设置为pageContent[0]
。如果您随后滑动,pageViewController 将调用
viewControllerAfterViewControler:viewController
。在此调用中,viewController
参数是 current 视图控制器。该方法需要知道当前 VC 的索引,因此它以viewController
作为参数调用indexOfVC
。indexOfVC
读取该视图控制器的dataObject
值,即pageContent[0]
。因此pageContent.indexOfObject(dataObject)
returns 是整数 0。然后递增 (
index++
),因此调用viewControllerAtIndex
将为索引 1 创建一个新的 VC。这将创建一个新视图控制器并立即将其dataObject
设置为 pageContent[1]。循环继续...
因此,按照当前编码,indexOfVC
从未 通过 viewController,其中 dataObject
为零。但如果它曾经是,它将 return 特殊值 NSNotFound
。然后 viewControllerAfterViewController:
检查 return 值,如果它 是 NSNotFound
,returns nil
- 它告诉页面视图控制器不允许滑动。