2014-09-27 3 views
3

Итак, я получил этот код для моего простого приложения для iOS. Когда я нажимаю кнопку touchPressed, кнопка должна получить новое случайное местоположение на экране, а labelScore должен обновить себя с помощью нажатия кнопки. Один мой друг попытался это сделать в Objective-C, и он работает.Странный конфликт @IBAction или ошибка? (Swift)

Проблема: у меня есть newScore() в touchpedPressed, и кнопка не получает новое местоположение. Если я прокомментирую newScore(), действие случайного местоположения будет работать.

Заранее спасибо.

// ViewController.swift 


import UIKit 
import SpriteKit 

class ViewController: UIViewController { 

@IBOutlet var backgroundImage: UIImageView! 

@IBOutlet var scoreLabel: UILabel! 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 





// Initial score 
var score:Int = 0 



// Update the actual score with the one matching th number of touches 
func newScore() { 
    score = score + 1 
    scoreLabel.text = "SCORE: \(score)" 
} 



// Get the random height for the button (with limits) 
func randomButtonHeight(min: Float, max:Float) -> Float { 
    return min + Float(arc4random_uniform(UInt32((max-90) - min + 1))) 



} 

@IBAction func touchPressed(button: UIButton) { 



    // Find the button's width and height 
    var buttonWidth = button.frame.width 
    var buttonHeight = button.frame.height 

    // Find the width and height of the enclosing view 
    var viewWidth = button.superview!.bounds.width 
    var viewHeight = button.superview!.bounds.height 


    // Compute width and height of the area to contain the button's center 
    var xwidth = viewWidth - buttonWidth 
    var yheight = viewHeight - buttonHeight 

    // Generate a random x and y offset 
    var xoffset = CGFloat(arc4random_uniform(UInt32(xwidth))) 
    var yoffset = CGFloat(self.randomButtonHeight(100, max: Float(viewHeight))) 

    // Offset the button's center by the random offsets. 
    button.center.x = xoffset + buttonWidth/2 
    button.center.y = yoffset + buttonHeight/2 


    newScore() // this works but the action above this doesn't and if I comment this line, the action above works. 

} 



} 
+0

Очень хорошо спросил - я могу легко воспроизвести проблему. – matt

+0

Возможно, кто-то нашел обходное решение для этого. – perte

ответ

3

Теперь @ Matt определил проблему, у меня есть другое предложение о том, как справиться с этим:

1) Добавить два новых ВАР к вашему ViewController:

var newButtonX: CGFloat? 
var newButtonY: CGFloat? 

2) Установите их в touchPressed() при обновлении местоположения кнопки.

// Offset the button's center by the random offsets. 
newButtonX = xoffset + buttonWidth/2 
newButtonY = yoffset + buttonHeight/2 
button.center.x = newButtonX! 
button.center.y = newButtonY! 

3) Добавить IBOutlet для кнопки к вашему ViewController:

@IBOutlet weak var button: UIButton! 

и провод его в Interface Builder.

4) Затем переопределить viewDidLayoutSubviews следующим образом:

override func viewDidLayoutSubviews() { 
    if let buttonX = newButtonX { 
     button.center.x = buttonX 
    } 
    if let buttonY = newButtonY { 
     button.center.y = buttonY 
    } 
} 
+0

Неустранимая ошибка: неожиданно найдено нуль при разворачивании необязательного значения (lldb) on - button.center.x = buttonX – perte

+0

убедитесь, что вы подключили свою кнопку к розетке в раскадровке – vacawama

+0

Должен ли я создать другую? Моя кнопка уже подключена к контактуДоказано – perte

2

Это связано с тем, как работает система рисования/компоновки. У вас небольшая проблема с синхронизацией, вот и все. Что действительно происходит, так это то, что кнопка движется, но макет происходит сразу после этого и снова возвращается. Одно из решений, чтобы обернуть все, кроме вызова newScore в короткой задержки, как это:

@IBAction func touchPressed(button: UIButton) { 
    delay(0) { 
     // Find the button's width and height 
     var buttonWidth = button.frame.width 
     // ... 
    } 
    self.newScore() 
} 

В качестве альтернативы, отключить Auto Layout в этом раскадровки/XIb файл. Это тоже решает (хотя это может быть неприемлемо по другим причинам).

+0

Для функции 'delay' см. Мой ответ здесь: http://stackoverflow.com/a/24318861/341994 – matt

+0

Использование задержки частично работает, потому что есть моменты, когда кнопка остается там, но отключение автоматического макета работает лучше. – perte

+0

Да, я тоже это заметил. Это может помочь сделать этикетку намного больше (шире), чем она должна быть. – matt

Смежные вопросы