Не удается развернуть необязательно — нет Swift

#ios #swift

#iOS #swift

Вопрос:

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

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

    if(segue.identifier == "detailViewSegue")
    {
        var DVC:DetailedViewController = segue.destinationViewController as DetailedViewController
        let path:NSIndexPath = self.tableView.indexPathForSelectedRow()
        var segueRecipeName:String = recipeMgr.RecipeName[path.row] as String
        DVC.detailedRecipeLabel.text = segueRecipeName
        } 
}
 

Проблема возникает в этой строке —

 DVC.detailedRecipeLabel.text = segueRecipeName //Can't UnWrap Optional - None
 

Я знаю, что должен проверять нулевое значение segueRecipeName перед назначением. Я выполняю проверку печати на консоли, и она явно не равна нулю. Ошибка возникает только тогда, когда я присваиваю значение объекту класса контроллера 2-го вида. Я уверен, что это поможет другим изучать Swift 🙂

Комментарии:

1. Вы не указали, что такое «проблема» или «ошибка». добавьте журнал ошибок или что- то в этом роде.

2. Спасибо, Окума, просто отредактировал мой пост.

3. что такое detailedRecipeLabel ? правильно ли подключен этот выход?

4. Да. @IBOutlet var detailedRecipeLabel: UILabel на DetailedViewController

5. Как правило, следует избегать изменения представлений другого view controllers для поддержания согласованности. Установите свойства, которые сам контроллер представления может использовать для принятия собственных решений о просмотре содержимого.

Ответ №1:

DVC.detailedRecipeLabel является nil

Вероятно, это IBOutlet то, что еще не загружено.

Вы должны добавить к своему пользовательскому свойству DetailedViewController , которое будет принимать ваш текст, сохранить его, а затем вы можете назначить его метке viewDidLoad .

Пример:

 class DetailedViewController ... {
  ...
  var recipeName: NSString? = nil

  ...

  override func viewDidLoad() -> () {
     ...
     self.detailedRecipeLabel.text = self.recipeName
  }
}   
 
 DVC.recipeName = segueRecipeName
 

Комментарии:

1. Спасибо @Sulthan. Итак, я просто присвоил значение segueRecipeName переменной в DetailedViewController и в методе ViewLoad() переназначил значение переменной для метки (которая, как я полагаю, загружена сейчас), и она работает нормально. DVC.detailedrecipeName = segueRecipeName и в ViewLoad() detailedRecipeLabel.text = detailedrecipeName Это правильный способ сделать это? Поскольку у меня будет больше значений, таких как Image, которые мне нужно будет передать из первого представления во второе.

2. @NarenSingh Если у вас есть больше значений для передачи, возможно, вам следует обернуть их в пользовательский объект и передать только этот один объект.