【问题标题】:iOS view controller loaded twice old web view being referenced sometimes when scanning bluetooth barcode scanneriOS 视图控制器在扫描蓝牙条码扫描器时有时会加载两次旧的 Web 视图
【发布时间】: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
  • 用大写命名变量会让人困惑。
  • 您的控制器似乎被多次创建,而不仅仅是呈现。 nil webview 的日志(我猜)来自一个仍然存在的 VC,但它的视图不在屏幕上。视图被卸载并释放了它的子视图,webview 就是其中之一。确保你没有在你不想创建的地方创建多个这个控制器。
  • 0x0 是旧的 Web 视图,因为我将其设置为 nil 进行测试。在我这样做之前,它引用了旧的 Web 视图。不过我想要多个视图......因为用户可以返回并选择一个新的 URL 来加载。有没有办法解决这个问题?
  • 此外,不只是 Web 视图是不好的参考。整个 self 对象是对之前 StoreWebViewController 的引用。我认为当视图控制器从视图中移除时,我需要找到一种方法来移除所有引用。

标签: ios objective-c bluetooth


【解决方案1】:

问题是即使在视图被销毁后,前一个对象的计时器仍在运行。将以下代码添加到 viewDidDisappear 修复它

[ScanApiConsumer invalidate];
ScanApiConsumer = nil;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多