2017-09-23 22 views
-3

我有2个视图: - 一个用于放置玩家名称 - 一个用于玩游戏的一个。 但我不能不能通过名称的数据列表中的2视图控制器之间的Swift通过数据字符串列表

我编译时有此错误:

fatal error: Index out of range

//ViewController.swift 

    if(segue.identifier == "segue"){ 
     let secondView = segue.destination as! PlayViewController 

     var numberOfPlayer = 0 

     if(n1.text?.isEmpty == false){ 
      secondView.Player[0] = n1.text! 
      numberOfPlayer += 1 
     } 
     if(n2.text?.isEmpty == false){ 
      secondView.Player[1] = n2.text! 
      numberOfPlayer += 1 
     } 
     if(n3.text?.isEmpty == false){ 
      secondView.Player[2] = n3.text! 
      numberOfPlayer += 1 
     } 
     secondView.nbPlayer = numberOfPlayer 
    } 
} 

_

//PlayViewController 
class PlayViewController: UIViewController { 

var Player = [String]() 
var nbPlayer = Int() 
+1

你是什么意思,你不能传递数据?你是否有编译时或运行时错误?请具体解释什么不起作用。 –

+0

当我编译我有这个错误:从私人有效的用户设置阅读。 致命错误:索引超出范围 –

回答

0

PlayViewController.Player被初始化为空数组,因此当您试图通过索引访问其元素时出错。您必须使用默认值初始化数组达到特定的长度,或者您必须使用append将元素插入数组,而不是通过索引来赋值。

此外,在访问UITextField的文本属性时,应该使用可选绑定来打开值,然后检查文本是否为空。也不需要numberOfPlayer变量,您可以使用players中的元素数量(请遵守Swift命名约定,该变量名称为lower-camelCase,因此将Player重命名为players)。

//ViewController.swift 
if(segue.identifier == "segue"){ 
    let secondView = segue.destination as! PlayViewController 

    if let text1 = n1.text, !text1.isEmpty { 
     secondView.players.append(text1) 
    } 
    if let text2 = n2.text, !text2.isEmpty { 
     secondView.players.append(text2) 
    } 
    if let text3 = n3.text, !text3.isEmpty { 
     secondView.players.append(text3) 
    } 
    secondView.nbPlayer = secondView.players.count 
} 

它可能是一个更好的解决方案以初始化nbPlayer作为计算的属性,所以它总是反映players数组中的元素数目。或者说,你甚至不应该把这个号码存储在一个单独的变量中,只需要访问players.count就可以访问它。

//PlayViewController 
class PlayViewController: UIViewController { 
    var players = [String]() 
    var nbPlayer:Int { 
     return players.count 
    } 
    ... 
} 
相关问题