2017-07-12 5 views
1

エラーのログに:原因アプリを終了キャッチされない例外により 'NSRangeException'、理由にアプリを終了:「*** - [__ NSArray0 objectAtIndex:]:インデックス2を境界を越えて空にNSArray

*キャッチされない例外 'NSRangeException'、理由: '* - [NSArray0 objectAtIndex:]:空のNSArrayのための境界を越えてインデックス2' ***まずスローコールスタック: ( 0 CoreFoundationの0x000000010fdd8b0b __exceptionPreprocess + 171 1 libobjc。 A.dylib 0x00000001143a6141 objc_excep tion_throw + 48 2 CoreFoundationの0x000000010fdf027d - [__ NSArray0 objectAtIndex:] + 93 3 DropInn 0x000000010d598fc4 _TFC7DropInn21ListingViewController9tableViewfTCSo11UITableView14didSelectRowAtV10Foundation9IndexPath_T_ + 5972 4 DropInn 0x000000010d599837 _TToFC7DropInn21ListingViewController9tableViewfTCSo11UITableView14didSelectRowAtV10Foundation9IndexPath_T_ + 87 5のUIKit 0x00000001122b3dcd - [のUITableView _selectRowAtIndexPath:アニメーション:scrollPosition:notifyDelegate:] + 1763 6のUIKit 0x00000001122b3fe3 - [のUITableView _userSelectRowAtPendingSelectionIndexPath:] + 344 7のUIKit 0x00000001121697f3 _runAfterCACommitDeferredBlocks + 318 8のUIKit 0x00000001121567bcの_cleanUpAfterCAFlushAndRunDeferredBlocks + 532__CFRunLoopRun + 1200 13 CoreFoundationの0x000000010fd63016 CFRunLoopRunSpecific + 406 14 GraphicsServices 0x0000000118249a24 GSEventRunModal + 62 15のUIKit 0x000000011215d0d4 UIApplicationMain9のUIKit 0x000000011218828c _afterCACommitHandler + 137 10 CoreFoundationの0x000000010fd7e717 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23 11 CoreFoundationの0x000000010fd7e687 __CFRunLoopDoObservers + 391 12 CoreFoundationの0x000000010fd63720 16 DropInn 0x000000010d240f47 main + 55 17 libdyld.dylib 0x0000000115fba65d start + 1 ) libC++ abi.dylib:terminatinタイプのキャッチされない例外とG NSException

エラースクリーンショット:

enter image description here

ソースコード:

let savearr : NSArray = (UserDefaults.standard.object(forKey: "savedarray") as! NSArray) 

print("Savearr data ->", savearr) 

let addarr: NSArray = savearr.value(forKeyPath:"country") as! NSArray 
let sumarr: NSArray = savearr.value(forKeyPath:"description") as! NSArray 
let titarr: NSArray = savearr.value(forKeyPath:"title") as! NSArray 

appDelegate.indexrow = indexPath.row 

print("addarr\(addarr)") 
print("sumarr\(sumarr)") 
print("titarr\(titarr)") 

let MenuViewController = self.storyboard?.instantiateViewController(withIdentifier: "five") as! FiveStepsViewController 

MenuViewController.writeTitleString = String(describing: titarr[indexPath.row]) 

MenuViewController.writeSummaryString = String(describing: sumarr[indexPath.row]) 

MenuViewController.writeAddressString = String(describing: addarr[indexPath.row]) 

//MenuViewController.writePriceString = String(describing: self.appDelegate.fivepricearray[indexPath.row]) 

self.present(MenuViewController, animated: true, completion: nil) 

エラーショーで:

MenuViewController.writeTitleString = String(describing: titarr[indexPath.row]) 

MenuViewController.writeSummaryString = String(describing: sumarr[indexPath.row]) 

MenuViewController.writeAddressString = String(describing: addarr[indexPath.row]) 
+0

あなたの配列はindexpath.row addarr [indexPath.row] ' –

+0

待ち、私はこの行をチェックします'フェッチする前にそれを確認するインデックスにある要素を持っていません私はここに戻ります。 –

+0

'IF(ANYOBJECTようindexPath.row] titarr).isEmpty!{ MenuViewController.writeTitleString =文字列(説明:[indexPath.row] titarr) }他{ プリント( "titarrが空である") }' –

答えて

1
if (titarr.count > 0) { 
    // rest of your code 
} 
+1

あなたの答えに感謝@adam –

+1

問題ない、助けて欲しい –

+0

はい、最後に私は結果を得た –

3

Apple's documentはと述べている:例えば越えたようないくつかのデータの 境界の外側にアクセスしようとするときに発生する例外の

NSRangeException

名前、文字列の終わり。あなたの場合の具体的

、3列の1つ(またはおそらく3つのすべて)、titarrsumarraddarrは空の配列であり、あなたは空の配列のインデックスにアクセスしようとしている=>NSRangeException

は、この問題を解決するには、次のことができます。配列が空で

チェックした場合:

if !titarr.isEmpty { 
    // titarr is non-empty 
} 

あるいは、より安全のために、アクセスをしたいインデックスが配列のデータの上限を超えていないかどうかを確認:

if titarr.count > yourIndex { 
    // index is valid 
} 

しかし、私は、インデックスへの直接アクセスを好む、それがある場合範囲を超えて、nilを返します。これを行うには、@kkuushkinの回答the questionを参照してください。例えば

、このような何か:

let titarr = [1, 2, 3] 

// Access the index beyond bounds, value is nil, no NSRangeException 
titarr[safe: 5] 
+0

あなたの提案をありがとうございました!私はこの方法を試して、私は戻ってくるだろう。 –

関連する問題