我使用本教程创建了一个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()
但它只是给我错误......我该怎么做?
答案 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
对象实际上实现了您正在调用的任何方法,否则它将最终崩溃。
多数民众赞成,希望你喜欢它。