ios - 如何从可选函数 didMoveToPage 中获取索引?

标签 ios swift

我在我的应用程序中使用 uacaps/CAPSPageMenu,但我不知道如何获取事件页面的编号,以便显示与该页面对应的网页。在代码 CAPSPageMenu.swift 中使用了以下代码。

import UIKit

@objc public protocol CAPSPageMenuDelegate {
// MARK: - Delegate functions

optional func willMoveToPage(controller: UIViewController, index: Int)
optional func didMoveToPage(controller: UIViewController, index: Int)
}

我认为可选 func didMoveToPage 中的 index: Int 部分为我提供了当前页面的编号。这是正确的吗?我如何在 ViewController.swift 代码中获取该索引号?

编辑
在 CAPSPageMenu 中,我找到了这段代码。

public func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    if scrollView.isEqual(controllerScrollView) {
        // Call didMoveToPage delegate function
        let currentController = controllerArray[currentPageIndex]
        delegate?.didMoveToPage?(currentController, index: currentPageIndex)

ViewController.swift 代码如下所示。

//
//  ViewController.swift
//  PageMenuDemoStoryboard
//
//  Created by Niklas Fahl on 12/19/14.
//  Copyright (c) 2014 CAPS. All rights reserved.
//

import UIKit


var websiteArray = ["http://website_0", "http://website_1", "http://website_2"]


//class ViewController: UIViewController {
class ViewController: UIViewController,CAPSPageMenuDelegate {

var pageMenu : CAPSPageMenu?
var pageNumber = 0

@IBOutlet weak var showWebsite: UIWebView!

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)


    // MARK: - UI Setup
    self.title = "App Title"
    self.navigationController?.navigationBar.barTintColor = UIColor(red: 30.0/255.0, green: 30.0/255.0, blue: 30.0/255.0, alpha: 1.0)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.barStyle = UIBarStyle.Black
    self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orangeColor()]

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "<-", style: UIBarButtonItemStyle.Done, target: self, action: "didTapGoToLeft")
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "->", style: UIBarButtonItemStyle.Done, target: self, action: "didTapGoToRight")


    // MARK: - Scroll menu setup

    // Initialize view controllers to display and place in array
    var controllerArray : [UIViewController] = []

    let controller1 : TestCollectionViewController = TestCollectionViewController(nibName: "TestCollectionViewController", bundle: nil)
    controller1.title = "Item_0"
    controller1.photoNameArray = ["Item_0.png"]
    controllerArray.append(controller1)
    let controller2 : TestCollectionViewController = TestCollectionViewController(nibName: "TestCollectionViewController", bundle: nil)
    controller2.title = "Item_1"
    controller2.photoNameArray = ["Item_1.png"]
    controllerArray.append(controller2)
    let controller3 : TestCollectionViewController = TestCollectionViewController(nibName: "TestCollectionViewController", bundle: nil)
    controller3.title = "Item_2"
    controller3.photoNameArray = ["Item_2.png"]
    controllerArray.append(controller3)


    // Customize menu (Optional)
    let parameters: [CAPSPageMenuOption] = [
        .ScrollMenuBackgroundColor(UIColor(red: 30.0/255.0, green: 30.0/255.0, blue: 30.0/255.0, alpha: 1.0)),
        .ViewBackgroundColor(UIColor(red: 20.0/255.0, green: 20.0/255.0, blue: 20.0/255.0, alpha: 1.0)),
        .SelectionIndicatorColor(UIColor.orangeColor()),
        .BottomMenuHairlineColor(UIColor(red: 70.0/255.0, green: 70.0/255.0, blue: 80.0/255.0, alpha: 1.0)),
        .MenuItemFont(UIFont(name: "HelveticaNeue", size: 13.0)!),
        .MenuHeight(30.0),
        .MenuItemWidth(90.0),
        .CenterMenuItems(true)
    ]

    // Initialize scroll menu
    pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRectMake(0.0, self.view.frame.height * 0.71, self.view.frame.width, self.view.frame.height * 0.33), pageMenuOptions: parameters)

    self.addChildViewController(pageMenu!)
    self.view.addSubview(pageMenu!.view)

    pageMenu!.didMoveToParentViewController(self)

    pageMenu!.delegate = self


    func willMoveToPage(controller: UIViewController, index: Int) {
        let subview=controller as! ViewController
        subview.pageNumber=index;
    }

}


func didTapGoToLeft() {
    var currentIndex = pageMenu!.currentPageIndex

    if currentIndex > 0 {
        pageMenu!.moveToPage(currentIndex - 1)
    }
    setWebPage()
}


func didTapGoToRight() {
    var currentIndex = pageMenu!.currentPageIndex

    if currentIndex < pageMenu!.controllerArray.count {
        pageMenu!.moveToPage(currentIndex + 1)
    }
    setWebPage()
}


func setWebPage() {
    var currentIndex = pageMenu!.currentPageIndex
    switch currentIndex {
    case 0:
        let url = NSURL (string: "\(websiteArray[0])");
        let requestObj = NSURLRequest(URL: url!);
        showWebsite.loadRequest(requestObj);
        break

    case 1:
        let url = NSURL (string: "\(websiteArray[1])");
        let requestObj = NSURLRequest(URL: url!);
        showWebsite.loadRequest(requestObj);
        break

    case 2:
        let url = NSURL (string: "\(websiteArray[2])");
        let requestObj = NSURLRequest(URL: url!);
        showWebsite.loadRequest(requestObj);
        break

    default:
        break
    }
}


// MARK: - Container View Controller
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}
}

当我点击按钮时,它会正常工作。导航栏显示事件页面,显示属于事件页面的图片(collectionViewController),还显示属于事件页面的网页。但我不想使用按钮。我想使用 collectionViewController,这样当我将图像滑动到下一页时,会显示新图像(这已经在工作)和相应的网页(这不工作,因为没有设置 pageMenu!.currentPageIndex ).
滑动图片时如何激活didTapGoToLeft和Right方法?

最佳答案

CAPSPageMenu 提供了一个委托(delegate)方法,通知其委托(delegate)页面已更改。这些是您在问题中列出的委托(delegate)方法。

因此,在您的 ViewController 类中,您需要实现这些委托(delegate)方法。

首先,告诉编译器你的类实现了协议(protocol):

class ViewController:UIViewController,CAPSPageMenuDelegate

现在,您需要将 View Controller 设置为委托(delegate)。在创建 CAPSPageMenu 的地方,您将需要这样的东西 -

pageMenu.delegate=self

最后,实现委托(delegate)方法。 CAPSPageMenu 提供了一组由它管理的 View Controller 。您没有给出这些的确切细节,但我假设它们实现了一些我称之为 SubViewController 的类。在此类中定义一个整数属性 pageNumber 然后您的委托(delegate)方法可以简单地是 -

func willMoveToPage(controller: UIViewController, index: Int) {
    let subview=controller as! SubViewController
    subview.pageNumber=index;
}

然后,在您的 SubViewController 中,您可以在 pageNumber 上实现一个 setter,它在页码更改时执行任何需要的操作。在您的委托(delegate)方法中,您还可以使用索引来索引一个字符串数组(比如 URL),然后在 subview Controller 上设置一个字符串/URL 属性——这取决于您要做什么。

关于ios - 如何从可选函数 didMoveToPage 中获取索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33386991/

相关文章:

ios - WKWebView - 如何获取我们刚刚触摸的输入类型的属性

swift - 如何从 ios swift 中的 Firebase 时间戳中删除时间?

ios - 在钥匙串(keychain)中存储多个用户名和密码凭证

iOS - UIToolBar 作为 UITextView 的 inputAccessoryView

swift - 是否可以在结构复制期间排除某些属性(如类类型)被复制?

ios - Swift 如何通过 userID 获取用户

ios - 如何在 collectionView 或 tableView 单元格中重复动画?

iphone - UITableViewCell 分配问题 - 单元格不为零

ios - 在 Swift 中使用单例和解析 JSON

ios - 根据 uid 访问 Firebase 存储镜像