2017-02-28 11 views
0

私はalertMapという名前のアウトレット(MKMapView)を持っていて、私のviewWillAppearに私のalertMapという初期のビューを設定しました。私のコードで時々 mapview.setRegion関数で実行時例外をキャッチする方法

func centerMapOnLocation(_ location: CLLocation) -> Bool { 
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 1.0, regionRadius * 1.0) 

    alertMap.setRegion(coordinateRegion, animated: true) // TODO: crash 

    return true 
} 

(と私は理由を知りませんが、これは別の時間のために別の質問です...)私の位置座標は、上記の機能にクラッシュを引き起こして、私のAPIに格納悪いです。

例外を「キャッチ」するためにいくつかの方法を試しましたが、不可能と思われます。

どのようにこのランタイムエラーをキャッチできますか。

エラーが読み:さまざまな人々のカップルが指摘

2017-02-28 12:54:33.400319 myApp[10433:2647466] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid Region <center:+1197269.18497000, -7972692.46846000 span:+0.00895306, -0.62941112>' 
*** First throw call stack: 
(0x1869091b8 0x18534055c 0x186908e80 0x192bffa0c 0x1000bd77c 0x1000bc728 0x1000bd4c0 0x18c7d6754 0x18c7d64cc 0x18cb0cf04 0x18ca4ffdc 0x18ca41d50 0x18c7b10b4 0x1868b60c0 0x1868b3cf0 0x1868b4180 0x1867e22b8 0x188296198 0x18c8297fc 0x18c824534 0x100130530 0x1857c55b8) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+2

「が、これは別の時間のために別の質問..です。" 同意しません。あなたは問題を無視して何かを解決しようとしており、その問題を回避しようとしています。これに1時間を費やして、問題を回避できるとしましょう。あなたのコードは修正されていますか?いいえ、問題はまだ残っていますが、結果が出ずに時間を無駄に過ごしました。問題を解決します。あなたが渡している座標が無効であるようです。それはどこから来ていますか? – Fogmeister

+0

@Fogmeisterあなたは完全に正しいです。私もその問題に取り組んでいます。しかし、時間が厳しいので、私はエラー処理でアプリケーションをリリースする必要があります。 – po5i

+0

場所を作成する必要があることを示すコードを追加してください。 – Fogmeister

答えて

3

として:あなたが最初の場所で実行時例外を無視しようとすべきではない

  1. 。 Objective-Cでさえ、これは最後の手段と考えられるべきです。
  2. 実行時の例外を無視したい場合でも、swiftはあなたに許可しません。あなたがやってする必要がどのよう

ガードブロックとデータを検証して、あなたの問題を引き起こすバックルートにトレース、のようなものされています

func centerMapOnLocation(_ location: CLLocation) -> Bool { 
    guard (-90.0 ... 90.0).contains(location.coordinate.latitude) else { 
     print("Unexpected latitude value \(location.coordinate.latitude)") 
     return false 
    } 

    guard (-180.0 ... 180.0).contains(location.coordinate.longitude) else { 
     print("Unexpected longitude value \(location.coordinate.longitude)") 
     return false 
    } 

    guard (0 ..< 10000.0).contains(regionRadius) else { 
     print("Unexpected region radius \(regionRadius)") 
     return false 
    } 

    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 1.0, regionRadius * 1.0) 

    alertMap.setRegion(coordinateRegion, animated: true) // TODO: crash 

    return true 
} 
+0

です。しかし、私はその場所が作成されているスタックをさらに調べています。それらの座標は途方もないです。ほとんどはintではなくメモリアドレスのように見えます。 – Fogmeister

+1

ええ、実際には解決策以上のアプローチを提示しようとしています:) –

+0

@DavidBerry素晴らしい検証。私はこのタイプのデータをどのように検証するか考えていませんでした。今のところそれは動作し、それは私の質問に答えます – po5i

関連する問題