【发布时间】:2015-10-08 20:37:54
【问题描述】:
我正在创建一个应用程序,该应用程序从套接字蓝牙条形码扫描仪(Socket Mobile)读取数据并将字符串注入 Web 视图。在应用程序期间,我的控制器可以加载多次。这就是问题发生的地方。有时条形码扫描在第二次加载时仍然引用了错误的 Web 视图。 (零对象参考)
我的视图控制器的 .m 文件中有以下内容
-(void)viewDidLoad
{
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[StoreWebViewController checkAndPrependProtocolForUrl:self.storeUrl]]]];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
ScanApi=[[ScanApiHelper alloc]init];
[ScanApi setDelegate:self];
[ScanApi open];
ScanApiConsumer=[NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(onBarcodeTimer:) userInfo:nil repeats:YES];
}
-(void)onBarcodeTimer: (NSTimer*)theTimer{
if(theTimer==ScanApiConsumer){
[ScanApi doScanApiReceive];
}
}
//called when scan happens
-(void) onDecodedDataResult:(long)result device:(DeviceInfo *)device decodedData:(ISktScanDecodedData*)decodedData
{
if(SKTSUCCESS(result))
{
NSLog(@"SCAN: %p", self.webView);
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
self.webView = nil;
}
在 .h 中(相关部分)
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (strong, nonatomic) ScanApiHelper* ScanApi;
@property (strong, nonatomic) NSTimer* ScanApiConsumer;
我扫描时的第一次加载:
2015-10-08 16:05:08.368 PHP POS[2646:971844] SCAN: 0x15cd3c6f0
2015-10-08 16:05:09.367 PHP POS[2646:971844] SCAN: 0x15cd3c6f0
2015-10-08 16:05:11.168 PHP POS[2646:971844] SCAN: 0x15cd3c6f0
扫描时第二次加载:
2015-10-08 16:05:38.670 PHP POS[2646:971844] SCAN: 0x15ee5ddb0
2015-10-08 16:05:40.269 PHP POS[2646:971844] SCAN: 0x15ee5ddb0
2015-10-08 16:05:41.168 PHP POS[2646:971844] SCAN: 0x0 //OLD WEB VIEW
2015-10-08 16:05:43.269 PHP POS[2646:971844] SCAN: 0x15ee5ddb0
2015-10-08 16:05:44.368 PHP POS[2646:971844] SCAN: 0x0 //OLD WEB VIEW
有没有办法解决这个问题?我不确定它是如何引用这两个对象的……计时器似乎没有运行两次;当我扫描时,只得到一个 NSLog 条目
编辑:
这是我创建 StoreWebViewController 的方法;这可能会发生多次。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"continueToStore"])
{
StoreWebViewController *controller = (StoreWebViewController *)segue.destinationViewController;
controller.storeUrl = [StoreUrlViewController checkAndPrependProtocolForStoreUrl:self.storeUrl.text];
}
}
【问题讨论】:
-
0x0 不是旧的 webview,它是
nil。 -
用大写命名变量会让人困惑。
-
您的控制器似乎被多次创建,而不仅仅是呈现。
nilwebview 的日志(我猜)来自一个仍然存在的 VC,但它的视图不在屏幕上。视图被卸载并释放了它的子视图,webview 就是其中之一。确保你没有在你不想创建的地方创建多个这个控制器。 -
0x0 是旧的 Web 视图,因为我将其设置为
nil进行测试。在我这样做之前,它引用了旧的 Web 视图。不过我想要多个视图......因为用户可以返回并选择一个新的 URL 来加载。有没有办法解决这个问题? -
此外,不只是 Web 视图是不好的参考。整个 self 对象是对之前 StoreWebViewController 的引用。我认为当视图控制器从视图中移除时,我需要找到一种方法来移除所有引用。
标签: ios objective-c bluetooth