Nano Hash - криптовалюты, майнинг, программирование

данные класса становятся нулевыми, когда я ссылаюсь на них в своем методе 'prepareForSegue'

У меня есть табличное представление с кнопками, каждая из которых содержит тег (в соответствии с indexPath.row), и когда я нажимаю определенную кнопку, сведения о содержимом этой ячейки (которая относится к классу с именем EventEntity) должны быть переданы через ' prepareForSegue' на другой экран.

Значение присваивается в методе 'infoButtonDidPress', как показано ниже:

func infoButtonDidPress(sender: UIButton){
    eventPressed = eventEntities[sender.tag]
println (eventPressed.name) // prints the name, all good here.
}

Проблема в том, что когда я присваиваю содержимое eventPressed VC назначения в 'prepareForSegue', оно равно нулю. Код ниже:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "infoButtonSegue"){
        var svc = segue.destinationViewController as! EventDetailsViewController;

    println (eventPressed.name) // NOPE.
    svc.name = eventPressed.name //also NOPE!
}

eventPressed объявлен выше viewDidLoad:

var eventPressed: EventEntity! = EventEntity()

Ошибка, которую я получаю, когда пытаюсь использовать любую из этих строк с комментарием «NOPE», — 'Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Appname.EventEntity name]: unrecognized selector sent to instance 0x7fa280e16a50' error

Что тут происходит?

Заранее спасибо!

ОБНОВЛЕНИЕ

Я переместил PerformWithSegue в метод infoButtonDidPress, но теперь не могу сослаться на targetViewController.

Мой infoButtonDidPress теперь выглядит так:

func infoButtonDidPress(sender: UIButton){
   let eventPressed = eventEntities[sender.tag]

   var destinationViewController: UIViewController = self.destinationViewController as EventDetailsViewController
 // error: the current VC does not have a member named destinationViewController

   self.performSegueWithIdentifier("infoButtonSegue", sender: self)
}
19.07.2015

  • Когда вы ставите let перед eventPressed в функции, вы создаете новую переменную для этой области. Вместо этого просто сделайте eventPressed = eventEntities[sender.tag] 20.07.2015
  • Я изменил его, но все еще получаю сообщение «Завершение работы приложения из-за необработанного исключения» NSInvalidArgumentException, причина: «-[Appname.EventEntity name]: нераспознанный селектор отправлен экземпляру 0x7fa280e16a50» 20.07.2015
  • Мне кажется, что это масштаб. Вы объявляете это с помощью var в viewDidLoad? В этом случае глобальная переменная все еще не объявлена. Попробуйте удалить var и посмотрите, изменится ли это. 20.07.2015
  • @JuliaWill нет, я объявляю это выше viewDidLoad. 20.07.2015
  • попробуй поставить точку останова и потом в отладчике по eventPressed. 20.07.2015
  • Я не знаю, почему я не уловил этого раньше... В основном происходит то, что метод подготовки к переходу вызывается перед 'infoButtonDidPress'. infoButtonDidPress — это функция, на которую нацелен 'infoButton.addTarget etc.' Как сделать, чтобы эта функция вызывалась первой? 20.07.2015

Ответы:


1

Как вы обнаружили, prepareForSegue происходит до вызова infoButtonDidPress.

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

См. это: Как подключить переход от значка ViewController

Обязательно установите идентификатор "infoButtonSegue". Затем вызовите переход из infoButtonDidPress после того, как вы установили значение для eventPressed:

func infoButtonDidPress(sender: UIButton){
    eventPressed = eventEntities[sender.tag]
    self.performSegueWithIdentifier("infoButtonSegue", sender: self)
}

А затем в prepareForSegue передайте значение целевому контроллеру представления:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "infoButtonSegue") {
        let dvc = segue.destinationViewController as! EventDetailsViewController

        dvc.name = eventPressed.name
    }
}
19.07.2015
  • Как я также обнаружил, вы удивительны. Спасибо! 20.07.2015
  • буду ли я по-прежнему использовать var svc = segue.destinationViewController as! EventDetailsViewController; а затем «svc.variableName» для ссылки на переменные в целевом VC? 20.07.2015
  • Да, все так же. Я бы предложил вызвать вашу переменную dvc для целевого контроллера представления вместо svc для исходного контроллера представления. Но да, вы настраиваете его так же, даже если вы вызываете переход программно. 20.07.2015
  • Бит «переход» в «segue.destinationViewController» не работает. Как мне в этом случае сослаться на аргумент UIStoryBoardSegue? 20.07.2015
  • Отредактируйте свой вопрос, указав последний код prepareForSegue. Что значит не работает? Вы получаете ошибку компиляции или ошибку времени выполнения? 20.07.2015
  • Ваш infoButtonDidPress должен выглядеть именно так, как я указал в своем ответе. Вам по-прежнему нужна отдельная функция prepareForSegue для фактической настройки. 20.07.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..