Подтвердить что ты не робот

Как перейти на новый контроллер представления с кодом только с помощью 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)

 }
4b9b3361

Ответ 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)    }