2015-02-08 2 views
1

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

Я хочу передать значение переменной detectString в ResultViewController из ScanViewController.

ScanViewcontroller, как показано ниже:

import UIkit 

class ScanViewController: UIViewController { 

    var detectionString : String! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     detectionString = “SomeDetectedString” 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject!) { 
     if (segue.identifier == "MySegue") { 
      var svc = segue.destinationViewController as ResultViewController; 
      svc.detectedString = detectionString 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

ResultViewController, как показано ниже:

import UIkit 

class ResultViewController: UIViewController { 

    var detectedString: String! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor=UIColor.whiteColor() 
     println(detectedString) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

Println (detectedString) не дает мне никакого результата. Вопрос в том, как получить переменную из ScanViewController?

+0

возможно дубликат [Проходят переменные из одного ViewController к другому в Swift] (http://stackoverflow.com/questions/24044108/pass-variables-from-one-viewcontroller-to-another-in-swift) – jtbandes

ответ

1

Это может быть так и причудливо, но в коде нет ничего плохого, но он не работает так, как есть. Я использовал ваш код одинаково, и он игнорировал segue. Затем я встроил ScanViewController в контроллер навигации в раскадровке. Я также позвонил self.performSegueWithIdentifier("MySegue", sender: self) в ScanViewController viewDidLoad, чтобы начать сеанс. Тогда все работает как шарм. Твой метод readyForSegue в порядке. Предложение Юврайсина в порядке, но не обязательно (я попробовал это после изменения DetailVC на ResultViewController). Без контроллера навигации ничего не работает. segue.identifier - это строка, и она будет работать в прямом сравнении строк Swift.

Вот код для ScanViewController:

import UIkit 

class ScanViewController: UIViewController { 

    var detectionString : String! 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     detectionString = "SomeDetectedString" 
     println(detectionString) 
     self.performSegueWithIdentifier("MySegue", sender: self) 
    } 

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

     if (segue.identifier == "MySegue" || segue.identifier == "SegueFromButton") { 
      println("prepareForSegue") 
      var svc = segue.destinationViewController as ResultViewController; 
      svc.detectedString = detectionString 
      println("svc.detectedString: \(svc.detectedString)") 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 


} 

и ResultViewController:

import UIkit 

class ResultViewController: UIViewController { 

    var detectedString: String! 

    override func viewDidLoad() { 
     println("Result Load View") 
     super.viewDidLoad() 
     self.view.backgroundColor=UIColor.whiteColor() 
     println("detectedString in Result: \(detectedString)") 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 
+0

, Спасибо за ответ, очень ценю вашу помощь, он работает, как вы описали. кроме этого, я также попытался получить значение доступа переменной с помощью appdelegate. Еще раз спасибо. – Rustam

1

Ваш segue.identifier == "MySegue" - это то, как не сравнивать в своем расположении.

замените ваш код следующей функцией, и все готово.

override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject!) { 
    let segueName: String = segue.identifier!; 
    if (segueName == "MySegue") { 
     var svc = segue.destinationViewController as DetailVC; 
     svc.detectedString = detectionString 
    } 
} 
+0

Спасибо за ваш ответ, если я вызываю segue @BIAction, я могу получить значение с первого значения. '@IBAction FUNC showsecond (отправитель: AnyObject) { self.performSegueWithIdentifier ("MySegue", отправитель: ноль) }' Это всякий раз, когда я врезался попытался Тригер непосредственно перейти программно. – Rustam

1

Есть три варианта для вас:

  1. использовать prepareForSegue метод, чтобы получить целевой ViewController и настроить свойство
  2. установить делегат отношения между двумя ViewControllers общаться
  3. набор наблюдатель с NSNotificationCenter
+0

Благодарю вас, я попробовал делегата, и он тоже работает для меня. – Rustam

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