2016-05-11 7 views
0

これは私が尋ねる必要がある最後の質問になりますように! 私は48時間これを調べていますが、まだ回答が見つかりません。ここでsegueを使って構造体配列から値を渡す:index of range

は、私が使用していたコードです:

DataSource.swift:

struct Game { 
    var name : String 
    var cheats : [Cheat] 
} 
struct Cheat { 
    var name : String 
    var code : String 
    var desc : String 
} 

GameListViewController.swift

import Foundation 
import UIKit 

class GameListViewController: UITableViewController { 

    var gamesArray = [Game]() 
    var cheatsArray = [Cheat]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     gamesArray = [Game(name: "Game1", cheats: [Cheat(name: "cheat1", code: "code1", desc: "desc1")])] 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return gamesArray.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell! 
     cell.textLabel?.text = gamesArray[indexPath.row].name 
     return cell 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow! 
     let DestViewController = segue.destinationViewController as! CheatListViewController 

     var DataPass : Cheat 
     DataPass = cheatsArray[indexPath.row] 
     DestViewController.cheatnameArray = DataPass.name 

     var DataPass2 : Cheat 
     DataPass2 = cheatsArray[indexPath.row] 
     DestViewController.cheatcodeArray = DataPass2.code 

     var DataPass3 : Cheat 
     DataPass3 = cheatsArray[indexPath.row] 
     DestViewController.cheatdescArray = DataPass3.desc 
    } 

} 

CheatListViewController.swift

class CheatListViewController: UITableViewController { 

    var cheatcodeArray = String() 
    var cheatnameArray = String() 
    var cheatdescArray = String() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 

W GameArrayから「Game 1」を選択すると、「DataPass」の最初のインスタンスから範囲外エラーのインデックスが即時に受信されます。 私はこのようにデータソースを構造化しているので、配列を別々に編集したり、オブジェクトをすっきりと整理したりする必要はありません。

誰かが正しい方向に向けることができたら、私は永遠に感謝しています!

種類を使用すると、任意の詐欺であなたのcheatsArray変数を埋めていないように見える私にとって ロリー

+0

indexPath.rowの値は何ですか? cheatsArray.countの値は何ですか? – Laffen

+0

私が正しく理解している場合、cheatsArray.countは1でなければなりません。gameArrayの[Cheat]のインスタンスです。 または、構造配列がどのように機能するかについて私は完全に誤解していますか? – user1263909

+0

私はあなたのcheatsArrayにチートを追加するあなたのコード内の場所を見つけることができません、これは手動で行う必要があります.. gamesArrayと同様。 – Laffen

答えて

1

について。そのため、範囲外の例外のインデックスを受け取るのはこのためです。あなたのコードから

あなたが達成するために探しているものを理解することは少し難しいですが、私はそれを持っていると思う。..

私はdestinationViewControllerをアンラップするために、オプションのバインディングを使用することに注意してくださいどのので、これは安全です実行された他のセグも、同じprepareForSegueを引き起こします。

if let destViewController = segue.destinationViewController as? CheatListViewController { 

    let indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow! 

    var game = gamesArray[indexPath.row] 

    destViewController.cheatnameArray = game.cheats.map({ $0.name }) 
    destViewController.cheatcodeArray = game.cheats.map({ $0.code }) 
    destViewController.cheatdescArray = game.cheats.map({ $0.desc }) 
} 
実際の文字列の配列ではなく文字列にあなたの配列を変更し

..

var cheatcodeArray = [String]() 
var cheatnameArray = [String]() 
var cheatdescArray = [String]() 

The Basics

+0

ありがとう、私は今すぐそれを試してみましょう! – user1263909

+0

"タイプ '[String]'の値を 'String'の結果タイプを閉じないように変換できません" – user1263909

+0

申し訳ありません、Laffen、うまくいきました。 恐ろしいものがありがとうございました:) – user1263909

関連する問題