Ios 在其他UIPageViewController中执行segue

Ios 在其他UIPageViewController中执行segue,ios,swift,segue,uipageviewcontroller,Ios,Swift,Segue,Uipageviewcontroller,我的表演顺序有问题。我正在使用InstructionView设置对象,并在PageViewController类中调用它来创建新的viewController 我可以在哪里设置操作,使用执行序列。如果我在指令视图中执行此操作,它将崩溃。我确实把它嵌入了NavigationController中。 我想我应该做一个委托方法,但我不知道在这种情况下如何做 请参见下面的我的代码: protocol InstructionViewDelegate { func didTapLab

我的表演顺序有问题。我正在使用InstructionView设置对象,并在PageViewController类中调用它来创建新的viewController

我可以在哪里设置操作,使用执行序列。如果我在指令视图中执行此操作,它将崩溃。我确实把它嵌入了NavigationController中。 我想我应该做一个委托方法,但我不知道在这种情况下如何做

请参见下面的我的代码:

    protocol InstructionViewDelegate
    {
    func didTapLabel(myString: NSString)  
    }  

    class InstructionView: UIViewController
    {
    var delegate : InstructionViewDelegate!
    var pageIndex : Int = 0
    var titleText : String = ""
    var otherImageFile : String = ""

    var tapLabel = UITapGestureRecognizer()

    override func viewDidLoad()
    {
    ....

    var label = UILabel(frame: CGRectMake(16, 825, 736, 104))
    ....
    view.addSubview(label)

    var imageViewObject : UIImageView
    ....
    view.addSubview(imageViewObject)

    tapLabel = UITapGestureRecognizer(target: self, action: "imageLabelAction:")
    tapLabel.numberOfTapsRequired = 1
    label.addGestureRecognizer(tapLabel)
    label.userInteractionEnabled = true
    imageViewObject.addGestureRecognizer(tapLabel)
    imageViewObject.userInteractionEnabled = true

    }

    func imageLabelAction(sender: AnyObject)
    {
    delegate.didTapLabel("The image was tapped")
    }
PageViewController:

class PageViewController:UIViewController、UIPageViewControllerDataSource、InstructionViewDelegate
{
var pageViewController:UIPageViewController?
变量pageTitles:Array=[“”,“”,“”]
var otherImages:Array=[“”,“”,“”]
var currentIndex:Int=0
重写func viewDidLoad()
{
super.viewDidLoad()
pageViewController=UIPageViewController(转换样式:。滚动,导航方向:。水平,选项:无)
pageViewController!.dataSource=self
让我们启动ViewController:InstructionView=viewControllerAtIndex(0)!
让ViewController:NSArray=[startingViewController]
pageViewController!.SetViewController(ViewController,方向:。正向,动画:false,完成:nil)
pageViewController!.view.frame=CGRectMake(0,0,view.frame.size.width,view.frame.size.height);
addChildViewController(pageViewController!)
view.addSubview(pageViewController!.view)
pageViewController!.didMoveToParentViewController(自身)
}
func didTapLabel(myString:NSString){
println(myString)
self.performsguewithidentifier(“testSegue”,发送方:self)
}
.....
func viewControllerAtIndex(索引:Int)->指令视图?
{
如果self.pageTitles.count==0 | | index>=self.pageTitles.count{
归零
}
让pageContentViewController=InstructionView()
pageContentViewController.otherImageFile=其他图像[索引]
pageContentViewController.titleText=页面标题[索引]
pageContentViewController.pageIndex=索引
pageContentViewController.delegate=self
当前索引=索引
返回页面内容视图控制器
}
}

是的,我认为委派代表可能是最好的途径。在
指令视图
Swift文件中,定义一个协议,描述指令视图与其代表之间的通信:

protocol InstructionViewDelegate {
    func didTapLabel(myString : String)
}
我假设您正在将一个字符串值从InstructionView传递回委托;修改此项以反映实际要传递的数据。将
委托
变量添加到
说明视图

var delegate : InstructionViewDelegate!
还添加一个
imageLabelAction
函数,如下所示:

func imageLabelAction(sender: AnyObject) {
    // perform any actions here in response to the label being tapped, and finish with:
    delegate.didTapLabel("The image label was tapped")
    // (amend the argument to what you need to send to your TestViewController)
}
修改
PageViewController
的类定义,以表明其采用指令ViewDelegate协议:

class PageViewController: UIViewController, UIPageViewControllerDataSource, InstructionViewDelegate {
func didTapLabel(myString: String) {
    println(myString)
    // do any processing here (e.g. save myString to a local var)
    // before triggering the segue:
    self.performSegueWithIdentifier("FromPageVCtoTestVC", sender: self)
}
请记住将InstructionView的委托设置为指向self:

startingViewController.delegate = self
然后实现协议定义的功能:

class PageViewController: UIViewController, UIPageViewControllerDataSource, InstructionViewDelegate {
func didTapLabel(myString: String) {
    println(myString)
    // do any processing here (e.g. save myString to a local var)
    // before triggering the segue:
    self.performSegueWithIdentifier("FromPageVCtoTestVC", sender: self)
}

然后,您可以使用
prepareforsgue
以常规方式将相关数据传递给目标视图控制器。

请澄清您的问题?您是否希望了解如何以及在何处实现
imageLabelAction:
方法以执行到新ViewController的转换?抱歉,解释得不好。是的,这正是我的意思。我试着用一个委托来做,但它会给我一个nill值。我对Swift还是新手。这个序列是在你的故事板中设置的吗?是的,我使用了一个从PageViewController到新TestViewController的故事板序列谢谢你对pbasdf的详细解释,很抱歉反应太晚。我现在尝试运行代码,但问题是没有标识符为的segue:reason:'Receiver()没有标识符为'testSegue'的segue。请参阅更新的代码。Ps:我现在不想传递数据。您不需要这一行:
self.performsguewithidentifier(“testSegue”,sender:self)
函数中的
imageLabelAction
函数(因为
PageViewController
中的
didTapLabel
函数将执行segue)。我仍然得到一个nill值,
在展开可选值时意外发现nil
。代码在'delegate.didTapLabel(“图像被点击”)`protocol func处停止。我和代表们做了一些其他的练习项目,效果很好。我认为这里的情况是,我在PageViewController中创建了一个新的ViewController,它不会在中接受代理。找到了解决方案。创建新的pageContentViewController时,我只需将委托声明给它自己。参见代码。谢谢