2015-12-24 1 views
2

Я новичок в swift, и я не нашел никаких ответов об этом. У меня есть игра, где есть слайдер и случайное значение, поэтому пользователь должен угадать значение на слайдере. Когда пользователь угадывает номер и нажимает кнопку ok, он вызывает контроллер вида. Когда он приближается, он вызывает другой контроллер представления, и, наконец, если он этого не догадается, он вызывает другой, и пользователь перезагружается. Мой вопрос в том, как я могу создать segue программно, чтобы передать полученные очки и раунды каждому из контроллеров вида, просто нажав ok. Эти диспетчеры просмотров создаются в раскадровке, и я называю их кодомКак я могу создать segue программно, чтобы передавать информацию между контроллерами представления - Swift

Спасибо за помощь!

@IBAction func okButton(sender: AnyObject) { 

    let diferencia = abs(targetValue - currentValue) 
    var point = 100 - diferencia 
    score += point 

    func bonusPoints() { 
    score += 100 
    } 
    if diferencia == 0 { 

     let viewController3 = self.storyboard!.instantiateViewControllerWithIdentifier("GonPerfectViewController") as UIViewController 
     presentViewController(viewController3, animated: true, completion: nil) 
     point += 100 
     newRound() 
     updateLabel() 
     bonusPoints() 
      } else if diferencia < 4 { 

      let viewController3 = self.storyboard!.instantiateViewControllerWithIdentifier("GonNiceTry1ViewController") as UIViewController 
      presentViewController(viewController3, animated: true, completion: nil) 
      point += 50 
      newRound() 
      updateLabel() 

      } else { 

     let viewController3 = self.storyboard!.instantiateViewControllerWithIdentifier("GonThirdViewController") as UIViewController 
     presentViewController(viewController3, animated: true, completion: nil) 

     startnewgame() 
     updateLabel() 

    } 
} 
+0

Ваш просмотрКонтроллеры в раскадровке? Вы можете использовать 'prepareForSegue' и' performSegueWithIdentifier' – mat

ответ

4

Так как вы говорите «Эти контроллеры ракурса созданы в раскадровке» Я считаю, что вы можете использовать performSegueWithIdentifier и prepareForSegue:

Объявите свою переменную за пределами вашего метода okButton.

let targetValue = 10 // this is just to test the first case 
    let currentValue = 10 // this is just to test the first case 
    var score = 0 
    var point = 0 

@IBAction func okButton(sender: AnyObject) { 

     let diferencia = abs(targetValue - currentValue) 
     point = 100 - diferencia 
     score += point 
     func bonusPoints(){ 
      score += 100 

     } 
     if diferencia == 0{ 
      performSegueWithIdentifier("GonPerfectViewController", sender: nil) 
      point += 100 
      print(point) 
      newRound() 
      updateLabel() 
      bonusPoints() 
     }else if diferencia < 4{ 

      performSegueWithIdentifier("GonNiceTry1ViewController", sender: nil) 

      point += 50 
      newRound() 
      updateLabel() 

     }else{ 

      performSegueWithIdentifier("GonThirdViewController", sender: nil) 


      startnewgame() 
      updateLabel() 

     } 

} 

, то вы должны использовать prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "GonPerfectViewController"{ 

     let vc = segue.destinationViewController as! GonPerfectViewController 

     vc.point = point 
    } 
    if segue.identifier == "GonNiceTry1ViewController"{ 

     let vc = segue.destinationViewController as! GonNiceTry1ViewController 

     vc.point = point 
    } 
    if segue.identifier == "GonThirdViewController"{ 

     let vc = segue.destinationViewController as! GonThirdViewController 

     vc.point = point 
    } 


} 

убедитесь, что вы установите SEGUE идентификатор в каждом viewControllers

enter image description here

и, конечно, вы должны объявить var point также в контроллеры вашего вида:

class GonPerfectViewController: UIViewController { 

var point = 0 

override func viewWillAppear(animated: Bool) { 
    print(point) 

} 

} 

Вы можете найти более подробную информацию о Segue here

1

Нет, вы не можете создать segue программно.

Что касается информации, прощайте, просто установите контроллер следующего вида и передайте информацию. Нажимайте или выполняйте программирование.

NSString * storyboardName = @"MainStoryboard_iPhone"; 
NSString * viewControllerID = @"ViewID"; 
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil]; 
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID]; 
controller.infoDict = myDictToPass; 
[self presentViewController:controller animated:YES completion:nil]; 

Просто вам нужно найти ту же код для скор ... Я надеюсь, что вы будете делать это ...

1

Так что это должно быть эквивалентно в Swift из Nirav Gadhiya отвечают:

let storyboardName = "MainStoryboard_iPhone" 
let viewControllerID = "ViewID" 
let storyboard = UIStoryboard(name: storyboardName, bundle: nil) 
let controller = ViewController().storyboard?.instantiateViewControllerWithIdentifier(viewControllerID) 
controller.infoDict = myDictToPass 
self.presentViewController(controller!, animated: true, completion: nil) 

Надежда, что помогает :)

0

И с Свифта 3 , развивая ответ Линуса G, который был переписал ответ Нирава Гадхия:

let storyboardName = "Main" 
let viewControllerID = "id_of_viewcontroller_specified_by_you_in_storyboard" 
let storyboard = UIStoryboard(name: storyboardName, bundle:nil) 
let controller = storyboard.instantiateViewController(withIdentifier: viewControllerID) 
controller.infoDict = myDictToPass 
//If it is a modal view: 
//controller.modalPresentationStyle = .overFullScreen 
self.present(controller, animated: false, completion: nil)