2017-01-21 4 views
0

Итак, я использую swift, и я довольно новичок в этом. В основном, когда я объявляю глобальную переменную, называемую точками в моем классе ViewController, я даю ей значение, и когда я печатаю его в этом классе, он печатает правильное значение. Я чем доступ к переменной в другом классе, и она всегда равна нулю. Я хочу получить доступ к значению переменной. Это мой класс ViewController.Быстрая глобальная переменная остается нулевой в другом классе

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate, UIScrollViewDelegate { 

    @IBOutlet weak var points: UITextField! 

    @IBAction func playButton(_ sender: AnyObject) { 
     let pts: Int? = Int(points.text!) //This is where I use points to covert it to an int 

     if(pts == 0) { 
      checkPoints.text = "Minimum points allowed is 1!" 
     }else if(pts! > 50) { 
     checkPoints.text = "Maximum points allowed is 50!" 
    }else{ 
     checkPoints.text = "" 
     let farray = arrayOfNames.filter() {$0 != ""} 
     if(farray.count > 0) { 
      print("Game starting") 
      print(arrayOfNames.count) 
     }else{ 
      print("No players added") 
      print(farray.count) 
     } 
    } 
} 

Это класс, с которого я пытаюсь получить доступ.

class test1212: UIViewController { 

var previousViewController: ViewController! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    previousViewController = ViewController() 

} 
@IBAction func test(_ sender: AnyObject) { 
    //for testing purposes, instead of converting points to an int, I just print it's string value...which doesn't work 
    print(previousViewController.points.text!) 

} 

Заранее благодарен!

ответ

1

Вы можете сделать это двумя способами, но не создавайте экземпляр для своего ViewController().

@Benjamin Lowry предлагается способ. Если вы хотите, чтобы все ViewController()., просто сделайте String (что угодно) в AppDelegate.

Объявите вашу собственность

var point = String() 

выше следующую строку

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate 

Затем непосредственно назначить значения этого свойства.

point = points.text! 

В вашем

метод действия playButton.

И получить доступ к нему из вашего класса test1212

override func viewDidLoad() { 
    super.viewDidLoad() 
    print(point) 

} 

Не забудьте обновить точку, если вам не нужно больше.

+0

Это сработало спасибо! – jim

2

В вашем test1212 ViewController в viewDidLoad у вас есть следующие строки:

previousViewController = ViewController() 

Что это делает это создать новый экземпляр этого вида контроллера и присвоить его переменной. Это означает, что ваше текстовое поле points по умолчанию не будет иметь значения.

Способ, которым вы должны выполнять этот тип передачи данных, - это использовать prepareForSegue. Когда вы непосредственно перейти от первого контроллера вашего второго контроллера вы должны делать что-то вроде этого:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "mySegue" { 

     if let destinationVC = segue.destination as? test1212 { 

      destinationVC.pointsText = self.points.text 

     } 
    } 
} 

Это потребовало бы вам создать переменную pointsText бечевки в классе test1212, но тогда вы можете легко передать значение, когда переходя от первого VC ко второму VC.

+0

Итак, я написал в коде, который у вас был, и я добавил pointText в качестве строковой переменной в моем классе test1212 следующим образом: var pointsText: String! ....Но когда я распечатываю pointText, я получаю сообщение об ошибке, потому что он говорит, что он нашел нуль, развернув необязательное значение. – jim

+0

Убедитесь, что вы также установили идентификатор вашего segue в «mySegue». Если да, то приведенный выше код должен работать. –

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