2015-11-07 2 views
0

Я пытаюсь создать простое приложение, состоящее из одного контроллера навигации с двумя экранами, управляемыми одним классом UIViewController. Приложение позволит пользователю вводить число от 0 до 10 в текстовом поле, а когда пользователь нажимает кнопку, они будут перенесены на второй экран, показывая, угадали ли они случайный номер. Когда я получаю доступ к текстовому свойству метки во втором экране, я получаю сообщение об ошибке «неожиданно найденное значение nil при разворачивании необязательного значения». Я не понимаю, почему я связал ярлык с классом. Любые предложения?найдено nil во время разворачивания необязательно

Это мой UI: enter image description here

Это моя навигация коды класса контроллера:

class MyNavController: UINavigationController { 
var ranNum:Int = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    ranNum = (Int)(arc4random_uniform(10)) 

    NSLog("random number: \(ranNum)") 
} 

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

} 

Это мой универсальный класс View контроллера:

class GenericViewController: UIViewController { 
@IBOutlet weak var inputTextField: UITextField! 
@IBOutlet weak var outputLabel: UILabel! 

var setThisLabel: String = "You Win!" 

@IBAction func guessTheNumber(sender: AnyObject) { 
    var generatedRanNumber = (parentViewController as! MyNavController).ranNum 
    var userGuessNumer = inputTextField.text.toInt() 

    if generatedRanNumber == userGuessNumer { 
     outputLabel.text = "You Win!" 
    } else if generatedRanNumber < userGuessNumer { 
     outputLabel.text = "Think Less..." 
    } else { 
     outputLabel.text = "Think Big..." 
    } 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 

} 

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

} 
+1

«обнаружено, что он будет разворачиваться дополнительно». Кто воля, и почему вы нашли его, пока вы разворачивали дополнительный? :) (Я предполагаю, что вы имели в виду «нашли ** nil ** при разворачивании необязательно».) –

+0

ha, я вижу слово с ошибкой сейчас: D. Будет ли это чистить. Благодаря! :) –

ответ

1

На самом деле проблема вы толкая от одного экземпляра контроллера общего вида к другому без передачи данных. Таким образом, обычно не рекомендуется использовать общий подкласс UIViewController. Если вы хотите, чтобы ваш код работал как есть, поместите UILabel в том же представлении, что и ваш другой пользовательский интерфейс, и не переходите (т. Е. Только один экземпляр GenericViewController). Или создайте два подкласса UIViewController, один из которых называется «GuessViewController», а другой - «AnswerViewController» и передайте значение угадывания между ними в prepareForSegue. GuessViewController обрабатывал бы получение строки от пользователя и оценивал бы ее. AnswerViewController будет ли это правильно или неправильно. Также обычно не требуется подкласс UINavigationController. Вы можете поместить этот код в viewDidLoad из GuessViewController.

+0

вы правы с некоторыми из ваших предложений. но я бы не сказал, что ** это на самом деле проблема **, которая вызывает «неожиданно найденный nil при разворачивании необязательного значения» ... :) –

+0

Я поместил весь свой код в Xcode и получил ошибку только с помощью segue. – beyowulf

+0

Спасибо за рекомендацию. Сейчас я попробую. :) –

2

переход от

var generatedRanNumber = (parentViewController as! MyNavController).ranNum 

в

var generatedRanNumber = (navigationController as! MyNavController).ranNum 

также заметить, что arc4random_uniform(10) возвращает число от 0 до 9. Вы говорите пользователю угадать число от 0 до 10.

+0

Спасибо за предложение. Я сделал это изменение, но проблема все еще существует:/Я попытаюсь создать два разных класса UIViewController и использовать метод prepareForSeguey. как -beyowulf предложил –

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