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