Swift 在 2 之间传递数据 ViewController 字符串列表

Swift Pass Data Between 2 ViewController List of String

我有两个观点: -一个用于放置玩家的名字 - 一个玩游戏。 但我不能不传递列表中的名称数据

当我编译时出现这个错误:

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()

PlayViewController.Player 被初始化为空数组,因此当您尝试通过索引访问其元素时会出错。您要么必须使用特定长度的默认值初始化数组,要么必须使用 append 将元素插入数组而不是按索引分配值。

此外,当访问 UITextFields 文本 属性 时,您应该使用可选绑定来解包值,然后检查文本是否为空。也不需要 numberOfPlayer 变量,您可以只使用 players 中的元素数量(请遵守 Swift 命名约定,变量名采用小驼峰命名法,因此将 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
    }
    ...
}