到达另一个viewcontroller文件中的函数?

时间:2016-09-11 10:05:30

标签: ios swift

我使用本教程创建了一个popupviewcontroller:https://www.youtube.com/watch?v=FgCIRMz_3dE

我希望当我按下弹出窗口(改为使用重试按钮)时,它应该返回到原始的Viewcontroller,就像它一样,但也会自动重启原始viewcontroller上的“游戏”。所以基本上我想在弹出窗口按“重试”时启动游戏。但是我在尝试达到这个功能时只会遇到错误..

Original Viewcontroller:

var time : Float = 0.0
    var timer: NSTimer?


    @IBOutlet weak var progressBar: UIProgressView!


    override func viewDidLoad() {
        super.viewDidLoad()
        startGame()
    }
    func startGame() {
        startTimer()

    }
    func startTimer() {
        timer = NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector:#selector(GameViewController.setProgress1), userInfo: nil, repeats: true)

    }
    func setProgress1() {
        time += 0.001
        progressBar.setProgress(time / 2, animated: true)
        if time >= 1.9 {
            endPopUp()
            timer!.invalidate()
            progressBar.setProgress(0.0, animated: false)
            setProgress1(time = 0.0)

        }
    }


    func endPopUp() {
        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("endPopUpID") as! PopUpViewController
        self.addChildViewController(popOverVC)
        popOverVC.view.frame = self.view.frame
        self.view.addSubview(popOverVC.view)
        popOverVC.didMoveToParentViewController(self)



        }



}

正如您所看到的,当时间达到1.9时,应该会出现popOverVC,但是当弹出窗口关闭popOverVC中的按钮时,我想键入: GameViewController()。startGame()

但它只是给我错误......我该怎么做?

1 个答案:

答案 0 :(得分:0)

我不是那个快速的人,但是对于objective-c和swift来说,底层的概念是相同的。 代码示例在objective-c

<强> TODO:protocol标头文件中声明popOverViewContorller。作为您的州,您需要协议方法如下

@protocol PopOverViewControllerDelegate
    -(void)popOverRetryBtnPressed;
    -(void)popOverCloseBtnPressed;
@end

在头文件中声明属性如下

@interface PopOverViewController:UIIViewController
    ...//other staff
    @property id<PopOverViewControllerDelegate> myDelegate;
@end

现在,在您的重试按钮操作中应该看起来像这样

-(IBAction)onPressRetry:(id)sender
{
    if(self.myDelegate && [self.myDelegate respondToSelector:@selector(popOverRetryBtnPressed)])
    {
         [self.myDelegate popOverRetryBtnPressed];
    }
    else
    {
         NSLog(@"delegate not implemented");
    }
}

simillarly完成close按钮功能。现在在视图控制器中实现代理作为任何其他委托。不要忘记设置popOverViewController的{​​{1}}属性。

引擎盖下: 以下是使用委托模式时发生的情况。当声明myDelegate时,它包含的信息是对象在实现此协议时能够提供的信息。在上面的例子中,我们的协议说,符合这个协议的对象将包含两个名为protocol&amp;的函数。 popOverRetryBtnPressed。然后我们声明一个类型为popOverCloseBtnPressed的属性,它表示符合协议声明id<PopOverViewControllerDelegate>的任何类。设置此属性将包含对符合和实现委托方法的对象的引用。现在是时候在适当的地方调用这些协议方法了。在重试按钮操作中,请调用PopOverViewControllerDelegate,并以相同方式呼叫popOverRetryBtnPressed。现在,在调用check之前,popOverCloseBtnPressed对象实际上实现了您正在调用的任何方法,否则它将最终崩溃。

多数民众赞成,希望你喜欢它。