ios - 当我展示另一个视图控制器时,NSTimer 不会停止
问题描述
我有一个 viewController1 设置计时器。
当计时器倒计时到 0 时,我将呈现 viewController2。
计时器也继续运行,虽然我调用了计时器函数invalidate
然后我标记了当前的视图控制器代码,它似乎正确停止。
//ViewController2 *vc = [[ViewController2 alloc] init];
//[self presentViewController:vc animated:false completion:nil];
代码有什么问题?
#import "ViewController.h"
#import <WebKit/WebKit.h>
#import "ViewController2.h"
@interface ViewController ()<WKScriptMessageHandler, WKNavigationDelegate,WKUIDelegate>
@property (nonatomic,strong) WKWebView* webView;
@property (nonatomic, strong) WKWebViewConfiguration * webConfig;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic) int count;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:[self createWKWebApp]];
[self.view addSubview: self.webView];
[self.webView.configuration.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];
self.webView.scrollView.bounces = NO;
[self.webView setContentMode:UIViewContentModeScaleAspectFit];
self.webView.navigationDelegate = self;
self.webView.UIDelegate = self;
NSURL *url = [NSURL URLWithString:@"https://www.google.com.tw"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
self.count = 5;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];
}
-(void)timerFired {
NSLog(@"===) self.count : %d", self.count);
if (self.count == 0) {
ViewController2 *vc = [[ViewController2 alloc] init];
[self presentViewController:vc animated:false completion:^{
[self.timer invalidate];
self.timer = nil;
}];
} else {
self.count -= 1;
}
}
- (WKWebViewConfiguration *)createWKWebApp {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userContent = [[WKUserContentController alloc] init];
config.userContentController = userContent;
return config;
}
- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message {
}
@end
解决方案
使 viewWillDisappear 委托方法中的计时器无效,并在视图再次出现时再次触发。
推荐阅读
- cassandra - Cassandra 写语义
- ubuntu - VMware error "Unable to change power state of virtual machine UPS: Operation inconsistent with current state"
- mysql - 改进 InnoDB 设置 - 导致无法解释的锁
- asp.net - updatepanel for radiobuttonlist
- node.js - 在 end() 之前等待函数
- animation - 如何使用补丁沿圆形路径为 SDF 圆设置动画?
- excel - VBA Excel 错误 运行时错误 53-file not found
- java - setIconTextGap 用于居中对齐的标签
- flutter - Flutter Firebase Cloud 功能无法调用
- python - 无法执行云函数触发不允许未经身份验证的调用的 HTTP 触发的云函数?