Сделайте переход к контроллеру табличного представления из контроллера представления

Я пытаюсь сделать переход к контроллеру табличного представления, когда кнопка программно нажимается в моем контроллере представления. Вот мой код:

@objc func editProfileButtonAction(sender: UIButton!) {
    print("ButtonTapped")
    
    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if let identifier = segue.identifier {
        if identifier == "EditProfile" {
            var editProfileTableViewController = segue.destination as! EditProfileTableViewController
          editProfileTableViewController = self
        }
      }
    }
    
}

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


person CoderCoop    schedule 03.08.2020    source источник
comment
Это не переход. И в чем проблема?   -  person vadian    schedule 03.08.2020
comment
Я понимаю. Я не знаю, как это закодировать.   -  person CoderCoop    schedule 03.08.2020
comment
Вы должны спроектировать переход в Interface Builder, правильно установить идентификатор и вызвать performSegue. Если вам нужно передать данные, реализуйте prepare(for segue)   -  person vadian    schedule 03.08.2020
comment
Могу ли я увидеть пример?   -  person CoderCoop    schedule 03.08.2020
comment
Вот несколько вариантов: stackoverflow. ком/вопросы/5210535/   -  person vadian    schedule 03.08.2020
comment
Я не пытаюсь передать данные. Я просто пытаюсь показать контроллер tableview.   -  person CoderCoop    schedule 03.08.2020
comment
Это та же процедура.   -  person vadian    schedule 03.08.2020


Ответы (2)


Хорошо, чтобы уточнить это. Невозможно создать переход программно. Переходы — это стрелки на раскадровке, соединяющие один VC с другим. Они вызываются с помощью: PerformSegue. Это вызывает функцию подготовки.

Если вы хотите показать новый VC при нажатии кнопки (без перехода), то вы используете present(VC(), анимированный: true, завершение: nil) } внутри функции кнопки. VC представлен модально.

@objc func editProfileButtonAction(sender: UIButton!) {
    print("editProfileButtonAction")
    present(EditProfileTableViewController(), animated: true, completion: nil)
}
person FrugalResolution    schedule 03.08.2020
comment
Эй, я ценю это! Теперь я получаю сообщение об ошибке, касающееся развертывания nil для UIImage для изображения профиля моего пользователя, которое я никогда не получал до этой настоящей функции. - person CoderCoop; 04.08.2020
comment
Итак, теперь, если изображение не загружено внутри файла EditProfileTableViewController.viewDidLoad(). Затем вы должны передать его из FristVC в SecondVC, сделайте так: let editProfileTableVC = EditProfileTableViewController() editProfileTableVC.profileImage = UIImage(named: String) present(editProfileTableVC, animated: true, completion: nil) Вот как вы можете установить данные в новый VC. var profileImage: UIImage!должен быть создан в классе EditProfileTableViewController. - person FrugalResolution; 05.08.2020
comment
У меня есть функция, загружающая изображение профиля в viewDidLoad(). Я не уверен, что не так. - person CoderCoop; 05.08.2020
comment
Пришлите мне свои viewControllers, и я посмотрю. Мой торговый центр можно найти при поддержке по этой ссылке. ссылка - person FrugalResolution; 06.08.2020

Убедитесь, что переход в раскадровке имеет именно такой идентификатор: EditProfile. Обычно я пишу идентификаторы с маленькой буквы в начале. Также нужно подготовиться к Segue. Например, установите делегат:

  // Set ViewController class as the delegate of the EditProfileTableViewControllerDelegate protocol
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let identifier = segue.identifier {
      if identifier == "EditProfile" {
        let editProfileTableViewController = segue.destination as! EditProfileTableViewController
        editProfileTableViewController = self
      }
    }
  }

В какой-то момент во время написания кода я удалил всю свою раскадровку из-за слишком большого количества ошибок, которые я с трудом мог решить. Сейчас делаю все программно. Сначала было немного сложно настроить все представления самостоятельно, но в конце концов я очень рад, что больше не использую раскадровки. Для некоторых вещей мне нужен xib и для тестирования раскадровки. Просто если вам интересно: большинство iOS-программистов используют раскадровку, так что ничего страшного, если вы продолжите. Преимущество выполнения всего этого программно заключается в том, что больше нет переходов. Так что просто предъявите, а навигация ВК нажимает, хлопает, ...

person FrugalResolution    schedule 03.08.2020
comment
Я получаю сообщение об ошибке: Невозможно присвоить значение типа NewNetworkProfilesViewController типу EditProfileTableViewController. - person CoderCoop; 04.08.2020
comment
Похоже, ваш Segue указывает на NewNetworkProfilesViewController, но вы пытаетесь добраться до EditProfileTableViewController. Убедитесь, что вы используете уникальные идентификаторы. Также вы должны дать каждому ViewController, который вы создали на раскадровке, собственный класс. Например, создайте новый файл с именем класса: NewNetworkProfilesViewController.swift и EditProfileTableViewController.swift. Затем перейдите к раскадровке и назначьте классы своим ViewController. Тогда вы должны использовать as! EditProfileTableViewController вместо as! UITableViewController. и писать строчные буквы в именах переменных. пусть Эд - person FrugalResolution; 04.08.2020
comment
Я не знаю, как сделать переход программно. Я изменил код раньше и должен был обновить. Я опубликую новую редакцию сейчас. - person CoderCoop; 04.08.2020
comment
Хорошо, выглядит лучше, теперь сразу после печати (ButtonTapped) добавьте performSegue(withIdentifier: "EditProfile", sender: self). Затем напишите перед if let identifier = segue.identifier { оператор печати: print("preparing for: \(segue.identifier)") и посмотрите, отображается ли он в консоли при нажатии кнопки. - person FrugalResolution; 04.08.2020
comment
И вам не нужна эта строка editProfileTableViewController = self - person FrugalResolution; 04.08.2020
comment
Должна ли функция находиться внутри или вне функции Button Tapped? - person CoderCoop; 04.08.2020
comment
За пределами. Функция PerformSegue сначала вызывает функцию подготовки, затем выполняет переход в случае, если переход создан правильно с правильным идентификатором. У вас есть зум? Вы можете поделиться своим экраном, и я мог бы помочь вам лучше... - person FrugalResolution; 04.08.2020
comment
Теперь я получаю сообщение об ошибке: Использование неразрешенного идентификатора "segue" внутри функции кнопки. - person CoderCoop; 04.08.2020
comment
Итак, перейдите к своей раскадровке и стрелке перехода. И в инспекторе удостоверений этой стрелке перехода дайте идентификатор editProfile. Нажмите Ввод. После этого сделайте так, чтобы ваш код внутри вашего ViewController выглядел так, как показано в ответе ниже: - person FrugalResolution; 04.08.2020
comment
Я не могу. Этот контроллер представления создается программно. У меня нет раскадровки для этого перехода. - person CoderCoop; 04.08.2020
comment
Тогда вам не нужен PerformSegue. Вам просто нужно @objc func editProfileButtonAction(sender: UIButton!) { present(EditProfileTableViewController(), animated: true, completion: nil) } - person FrugalResolution; 04.08.2020
comment
Все мои функции под этим теперь красные, говоря, что нет себя - person CoderCoop; 04.08.2020
comment
Хорошо, чтобы уточнить это. Невозможно создать переход программно. Переходы — это стрелки на раскадровке, соединяющие один VC с другим. Они вызываются с помощью: performSegue. Это вызывает функцию prepare. Если вы хотите показать новый VC при нажатии кнопки (без перехода), то вы используете present(VC(), animated: true, completion: nil) } внутри функции кнопки. VC представлен модально. Если это отвечает на вопрос, пожалуйста, не забывайте про голоса. - person FrugalResolution; 04.08.2020
comment
Я дал вам краткое объяснение/обзор всего этого по вашему другому вопросу: /а> - person FrugalResolution; 04.08.2020