Как перейти на новый контроллер представления с кодом только с помощью Swift
Я хочу перейти с ViewController на secondViewController, когда пользователь нажимает UIButton, используя код только в Swift.
//Function to transition
func transition(Sender: UIButton!)
{
//Current Code, default colour is black
let secondViewController:UIViewController = UIViewController()
self.presentViewController(secondViewController, animated: true, completion: nil)
}
Ответы
Ответ 1
Проблема в том, что ваш код создает пустой UIViewController, а не SecondViewController. Вам нужно создать экземпляр вашего подкласса, а не UIViewController,
func transition(Sender: UIButton!) {
let secondViewController:SecondViewController = SecondViewController()
self.presentViewController(secondViewController, animated: true, completion: nil)
}
Если вы переопределили init (nibName nibName: String!, Bundle nibBundle: NSBundle!) В своем классе SecondViewController, то вам нужно изменить код на,
let sec: SecondViewController = SecondViewController(nibName: nil, bundle: nil)
Ответ 2
Это отлично сработало для меня:
func switchScreen() {
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "yourVcName") as? UIViewController {
self.present(viewController, animated: true, completion: nil)
}
}
Ответ 3
СВИФТ
Обычно для нормального перехода мы используем
let next:SecondViewController = SecondViewController()
self.presentViewController(next, animated: true, completion: nil)
Но иногда при использовании навигационного контроллера вы можете столкнуться с черным экраном. В этом случае вам нужно использовать, например,
let next:ThirdViewController = storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as! ThirdViewController
self.navigationController?.pushViewController(next, animated: true)
Кроме того, ни одно из вышеперечисленных решений не сохраняет навигационную панель при вызове из раскадровки или одного xib в другой xib. Если вы используете навигационную панель и хотите сохранить ее так же, как обычный push, вы должны использовать
Скажем, "MyViewController" является идентификатором для MyViewController
let viewController = MyViewController(nibName: "MyViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
Ответ 4
Ваш код в порядке. Причина, по которой вы получаете черный экран, заключается в том, что на вашем втором контроллере просмотра ничего нет.
Попробуйте что-то вроде:
secondViewController.view.backgroundColor = UIColor.redColor();
Теперь контроллер отображения, который он показывает, должен быть красным.
Чтобы сделать что-то с secondViewController
, создайте подкласс UIViewController
и вместо
let secondViewController:UIViewController = UIViewController()
создать экземпляр вашего второго контроллера представления:
//If using code
let secondViewController = MyCustomViewController.alloc()
//If using storyboard, assuming you have a view controller with storyboard ID "MyCustomViewController"
let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("MyCustomViewController") as UIViewController
Ответ 5
Для тех, кто использует второй контроллер представления с раскадровкой в файле .xib, вы захотите использовать имя файла .xib в своем конструкторе (без суффикса .xib).
let settings_dialog:SettingsViewController = SettingsViewController(nibName: "SettingsViewController", bundle: nil)
self.presentViewController(settings_dialog, animated: true, completion: nil)
Ответ 6
Для тех, кто делает это на iOS8, это то, что я должен был сделать:
У меня есть быстрый файл класса под названием SettingsView.swift
и .xib файл с именем SettingsView.xib
. Я запускаю это в MasterViewController.swift
(или любой диспетчер представлений, чтобы открыть второй контроллер представления)
@IBAction func openSettings(sender: AnyObject) {
var mySettings: SettingsView = SettingsView(nibName: "SettingsView", bundle: nil) /<--- Notice this "nibName"
var modalStyle: UIModalTransitionStyle = UIModalTransitionStyle.CoverVertical
mySettings.modalTransitionStyle = modalStyle
self.presentViewController(mySettings, animated: true, completion: nil)
}
Ответ 7
В Swift 2.0 вы можете использовать этот метод:
let registrationView = LMRegistration()
self.presentViewController(registrationView, animated: true, completion: nil)
Ответ 8
Всегда используйте файл nibName, иначе ваш предварительно загруженный контент Xib не будет отображаться.
vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)
Ответ 9
Обновленный для Swift 3, некоторые из этих ответов немного устарели.
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "myStoryboardID") as UIViewController
self.present(vc, animated: true, completion: nil) }