Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift ';UIButton.titleLabel?.text';不';未按预期工作/不';不覆盖字符串_Swift_Uibutton - Fatal编程技术网

Swift ';UIButton.titleLabel?.text';不';未按预期工作/不';不覆盖字符串

Swift ';UIButton.titleLabel?.text';不';未按预期工作/不';不覆盖字符串,swift,uibutton,Swift,Uibutton,我的问题如下: var player = 2 @IBOutlet weak var label: UILabel! @IBOutlet weak var button1: UIButton! @IBOutlet weak var button2: UIButton! @IBOutlet weak var button3: UIButton! func CheckWin() -> Bool { if button1.titleLabel?.text == button2.titl

我的问题如下:

var player = 2

@IBOutlet weak var label: UILabel!
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!

func CheckWin() -> Bool
{
    if button1.titleLabel?.text == button2.titleLabel?.text && button2.titleLabel?.text == button3.titleLabel?.text && button1.titleLabel?.text != nil
    {
        return true
    }
    else
    {
        return false
    }
}

@IBAction func buttonClick(_ sender: UIButton)
{
    if sender.titleLabel?.text == nil
    {
        if player%2==0
        {
            sender.setTitle("X", for: UIControlState.normal)
            player += 1
            turn += 1
            label.text = "Player 'O' Turn"
        }
        else
        {
            sender.setTitle("O", for: UIControlState.normal)
            player += 1
            turn += 1
            label.text = "Player 'X' Turn"
        }
    }
    if CheckWin()
    {
        resetButtons()
    }
}

func resetButtons() {

    button1.titleLabel?.text = nil
    button2.titleLabel?.text = nil
    button3.titleLabel?.text = nil
}
我正在尝试将按钮的文本重置为零(空/无文本),以重新启动游戏。这一切都很好,但当涉及到“func resetButtons()”-方法时,它会将按钮中的可见文本设置为nil,但不知何故,文本仍然是“X”或“O”

我曾尝试在resetButtons()方法中使用button1.setTitle(nil)和其他不同的文字,但它没有改变任何事情。我还尝试将设置从.System更改为Custom-也不起作用。 每次我调试它并转到断点时,它都会显示在“resetButton()”之后仍然应该更改按钮文本,它仍然是“X”或“O”,但很明显按钮是空的,因为它应该是空的。。。真奇怪

我发现问题可能是,当我首先设置按钮文本时,它是“sender.titleLabel?.text”,而不是“button1.titleLabel?.text”。这真的是问题所在吗


提前谢谢

您可以使用空字符串:

func resetButtons() {
    button1.setTitle("", for: .normal)
    button2.setTitle("", for: .normal)
    button3.setTitle("", for: .normal)
}
并按如下方式更改if控件:

@IBAction func buttonClick(_ sender: UIButton)
{
    if sender.titleLabel?.text == ""  //Changed control mechanism
    {
        if player%2==0
        {
            sender.setTitle("X", for: UIControlState.normal)
            player += 1
            turn += 1
            label.text = "Player 'O' Turn"
        }
        else
        {
            sender.setTitle("O", for: UIControlState.normal)
            player += 1
            turn += 1
            label.text = "Player 'X' Turn"
        }
    }
    if CheckWin()
    {
        resetButtons()
    }
}

正如我前面解释的,不要将nil用于空字符串。以下内容适合我。此外,(扫描文档后)还发现,
ui按钮.标题标签
是只读的。它自己的属性是读/写的,但是
标题标签本身是只读的,因此为什么必须使用
setTitle
,为什么使用
sender.titleLabel?.text
if
语句中不起作用。尝试以下方法

override func viewDidLoad() {
    super.viewDidLoad()

    resetButtons()
}

func CheckWin() -> Bool
{
    if button1.title(for: .normal) == button2.title(for: .normal) && button2.title(for: .normal) == button3.title(for: .normal) && button1.title(for: .normal) != ""
    {
        return true
    }
    else
    {
        return false
    }
}

@IBAction func buttonClick(_ sender: UIButton)
{
    if sender.title(for: .normal) == ""
    {
        if player%2==0
        {
            sender.setTitle("X", for: .normal)
            player += 1
            turn += 1
            label.text = "Player 'O' Turn"
        }
        else
        {
            sender.setTitle("O", for: .normal)
            player += 1
            turn += 1
            label.text = "Player 'X' Turn"
        }
    }
    if CheckWin()
    {
        resetButtons()
    }
}

func resetButtons() {

    button1.setTitle("", for: .normal)
    button2.setTitle("", for: .normal)
    button3.setTitle("", for: .normal)
}

如果外观正确,则调试器可能在欺骗您。这不是第一次发生在某人身上,很难解释。它将按钮。文本按我的要求设置为(空)。但是,当我再次单击按钮时,已经存储了一个值。它向我显示一个“X”或“O”,并且它不再在按钮上存储文本。我以前尝试过,但这会按照我的意愿重置按钮,但它不会让我再次单击按钮…因为你正在控制按钮文本,如果它们为零或否。如果您使用sender.titleLabel?.text=''控制它们,它将不再给出错误。我已经更新了答案。这与我的答案相同。@kkakkurt,对不起,是的。当我把它贴出来的时候,我抓到了。我修改了我的答案。非常感谢!终于成功了!你们两个!非常感谢你!你真让我高兴!很高兴听到这个消息。请接受其中一个答案。不管是哪一个-你的问题也帮我解决了问题。@Magnas,好了!再次感谢,很高兴听到这也帮了你一点忙。祝您有个美好的一天!