#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 Если у вас есть больше значений для передачи, возможно, вам следует обернуть их в пользовательский объект и передать только этот один объект.