Програмно перейдіть до іншого контролера / сцени перегляду


78

Я отримав повідомлення про помилку під час переходу від першого контролера перегляду до другого контролера перегляду. Моє кодування схоже на це

let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)

Проблема в тому, що я завжди отримував таке повідомлення про помилку

2014-12-09 16:51:08.219 XXXXX[1351:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/FDC7AA0A-4F61-47E7-955B-EE559ECC06A2/XXXXX.app> (loaded)' with name 'LoginViewController''
*** First throw call stack:
(0x2efcaf0b 0x39761ce7 0x2efcae4d 0x31b693f9 0x31ac1eaf 0x3191e365 0x317fe895 0x318a930d 0x318a9223 0x318a8801 0x318a8529 0x318a8299 0x318a8231 0x317fa305 0x3147631b 0x31471b3f 0x314719d1 0x314713e5 0x314711f7 0x3146af1d 0x2ef96039 0x2ef939c7 0x2ef93d13 0x2eefe769 0x2eefe54b 0x33e6b6d3 0x3185d891 0x4ccc8 0x4cd04 0x39c5fab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Вам потрібно додати LoginViewController.xibфайл у свій проект. Під час створення LoginViewController.swiftпереконайтеся, що вибрано включити xib.
габлер

Спробуйте додати повністю новий контролер подання та заміну LoginViewControllerта перевірте, чи працює він.
габлер

До речі, я використовую раскадровку
Мохаммад Нурдін,

Я теж використовую раскадровку і використовував ваш код для завантаження файлу xib, і це спрацювало для мене.
габблер

Щоб отримати доступ до розкадровки у вашому коді, вам потрібно встановити ідентифікатор дошки розкадрування у своїй розкадровці.
Ной

Відповіді:


134

Я вже знайшов відповідь

Стрімкий 4

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "nextView") as! NextViewController
self.present(nextViewController, animated:true, completion:nil)

Стрімкий 3

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

6
За допомогою ViewController ви можете отримати доступ до розкадрування за допомогою self.StoryBoard
Michael Brown

3
він приховує "навігаційну панель"
DanielZanchi

15
@ Danny182 Якщо ви хочете, щоб відображалася панель навігації, використовуйтеself.navigationController?.pushViewController(nextViewController, animated: true)
Fever

1
Що робити, якщо у нього є тег UINavigationController до UITabbarViewController, як в цьому випадку натиснути UINavigationController?
Кіран

Він (Swift 4) представляє новий контролер перегляду в модальному режимі
subair_a

43

Спробуйте це. Тут "LoginViewController" - це ідентифікатор розкадровки, вказаний у розкадровці.

Дивись нижче

let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
self.navigationController?.pushViewController(secondViewController, animated: true)

Я був здивований, що відповідь Нурдіна було запропоновано спрацювати (і вона не допомогла), бо це просто заклик push. Звичайно, ВИДАЄТЬСЯ, що це має спрацювати, оскільки ми маємо справу з контролером навігації
Sirens

41

XCODE 8.2 І SWIFT 3.0

Представте існування UIViewController

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.present(loginVC, animated: true, completion: nil)

Натисніть існувати UIViewController

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.pushViewController(loginVC, animated: true)

Пам'ятайте, що ви можете поставити UIViewControllerідентифікатор, виконавши наступні кроки:

  • Виберіть Main.storyboard
  • Виберіть свій UIViewController
  • Шукайте утиліти праворуч
  • Виберіть інспектора особи
  • Шукати у розділі «Ідентифікатор раскадровки»
  • Поставте ідентифікатор для вашого UIViewController

введіть тут опис зображення


1
Точна відповідь, я проголосував, але навіщо нам потрібен "Ідентифікатор відновлення"? Я вважаю, що "ID Storyoard" достатньо для цієї ситуації.
Yucel Bayram

Дякуємо за ваш відгук @yucelbayram Ідентифікатор відновлення - це рядок, який вам потрібно призначити будь-якому контролеру перегляду або перегляду, який ви хочете зберегти та відновити. У моєму випадку я використовую це поле, оскільки мені потрібна визначена функція, однак якщо вам це не потрібно, ви можете видалити.
Крістіан Мора

15

Якщо ви хочете перейти до контролера, створеного програмно, виконайте такі дії:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

Якщо ви хочете перейти до контролера на StoryBoard з ідентифікатором "newViewController", зробіть наступне:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

10

Подивіться моє.

func actioncall () {
    let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("LoginPageID") as! ViewController
    self.navigationController?.pushViewController(loginPageView, animated: true)
}

Якщо ви використовуєте стиль подання, ви можете втратити панель навігації сторінкою із заздалегідь встановленою кнопкою навігації.


10

Ви можете програмно переходити з однієї сцени на іншу, використовуючи код нижче:

  let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

  let objSomeViewController = storyBoard.instantiateViewControllerWithIdentifier(“storyboardID”) as! SomeViewController

  // If you want to push to new ViewController then use this
  self.navigationController?.pushViewController(objSomeViewController, animated: true)

  // ---- OR ----

  // If you want to present the new ViewController then use this
  self.presentViewController(objSomeViewController, animated:true, completion:nil) 

Тут storyBoardID - це значення, яке ви встановили для сцени за допомогою Interface Builder. Це показано нижче:

Знімок екрана, як встановити ID розкадрування


10

Swift3:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController("LoginViewController") as UIViewController
self.navigationController?.pushViewController(vc, animated: true)

Спробуйте це. Ви просто переплутали перо з представленням розкадровки.


6

Програмно існують різні способи, засновані на різних ситуаціях

  1. завантажити файл storyenter коду дощового файлу

    let yourVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as! YourViewController;
    self.present(yourVc, animated: true, completion: nil)
    
  2. Завантажити з xib

    let yourVc = YourViewController.init(nibName: "YourViewController", bundle: nil)
    self.present(yourVc, animated: true, completion: nil)
    
  3. Перемістіться по Segue

    self.performSegue(withIdentifier: "your UIView", sender: self)
    

Дякую. Я намагався використати метод для xib, натомість мені потрібен був метод для Storyboard. Ваша відповідь мені дуже допомогла!
Jonas Deichelmann

3
let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyCustomViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)

2

Ви можете здійснювати навігацію між контролерами перегляду за допомогою коду за допомогою розкадрування та storyboardId контролера перегляду. Цей код призначений для Swift 3:

let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
self.navigationController?.pushViewController(signUpVC, animated: true)

Чи є у Вашій відповіді вступ чи пояснення для коду? Можливо, перше речення на кшталт "Я думаю, ти хочеш такий код:".
Луїс Ланггольц,

2

XCODE 9.2 І SWIFT 3.0

ViewControllerщоб NextViewcontrollerбез Segue підключення

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(nextViewController, animated:true)

або

let VC:NextViewController = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(VC, animated: true)

1

Я даю вам свій код для переходу. У цьому прикладі дія підключається до кнопки UIB. Тому не забудьте встановити його. Не забудьте вказати в transitionметоді ім'я вашого ViewController .

Не забудьте також встановити свою розкадрування. Вам потрібно мати одне представлення даних для кожного viewController. Підключіть кожен ViewController до кожного подання в StoryBoard. Ви можете побачити на знімку екрана нижче

введіть тут опис зображення введіть тут опис зображення

class PresentationViewController: UIViewController {
    override func viewDidLoad() {
         super.viewDidLoad()

         var playButton   = UIButton.buttonWithType(UIButtonType.System) as UIButton

         let image = UIImage(named: "YourPlayButton") as UIImage?

         playButton.frame = CGRectMake(0, 0, 100, 100)
         playButton.center = CGPointMake(self.view.frame.width/2, self.view.frame.height/2)
         playButton.addTarget(self, action: "transition:", forControlEvents:  UIControlEvents.TouchUpInside)
         playButton.setBackgroundImage(image, forState: UIControlState.Normal)

         self.view.addSubview(playButton)
    }


func transition(sender:UIButton!)
{
    println("transition")
    let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("YourSecondViewController") as UIViewController

    let window = UIApplication.sharedApplication().windows[0] as UIWindow
    UIView.transitionFromView(
        window.rootViewController!.view,
        toView: secondViewController.view,
        duration: 0.65,
        options: .TransitionCrossDissolve,
        completion: {
            finished in window.rootViewController = secondViewController
    })
}
}

1

Якщо ви створюєте користувальницький інтерфейс без перетягування (без використання розкадрування) і хочете перейти на сторінку за замовчуванням або ViewController.swift на іншу сторінку? Виконайте ці кроки 1) додайте клас (.swift) 2) Імпортуйте UIKit 3) Оголосіть назву класу як

class DemoNavigationClass :UIViewController{
     override func viewDidLoad(){
         let lbl_Hello = UILabel(frame: CGRect(x:self.view.frame.width/3, y:self.view.frame.height/2, 200, 30));
lbl_Hello.text = "You are on Next Page"
lbl_Hello.textColor = UIColor.white
self.view.addSubview(lbl_Hello)
    }
}

після створення другої сторінки поверніться на першу сторінку (ViewController.swift) Тут зробіть кнопку в методі viewDidLoad

let button = UIButton()
button.frame = (frame: CGRect(x: self.view.frame.width/3, y: self.view.frame.height/1.5,   width: 200, height: 50))
 button.backgroundColor = UIColor.red
 button.setTitle("Go to Next ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

тепер визначте метод buttonAction поза viewDidLoad () в тому ж класі

func buttonAction(sender: UIButton!) 
{
    let obj : DemoNavigationClass = DemoNavigationClass();
    self.navigationController?.pushViewController(obj, animated: true)
}

Зберігайте одну річ, про яку я забув, на main.storyboard є сцена зі стрілкою, виберіть цю стрілку та натисніть кнопку видалення

тепер перетягніть контролер навігації та видаліть view table, який постачається з контролером навігації. виберіть навігаційний контролер, натисніть клавішу на клавіатурі та перетягніть його на іншу сцену на раскадровці, яка є ViewController. Це означає, що ваш контролер перегляду став кореневим контролером перегляду, сподіваюся, це допоможе вам подякувати в main.storyboard, перетягніть навігаційний контролер,


1
let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
// self.present(signUpVC, animated: false, completion: nil)
self.navigationController?.pushViewController(signUpVC, animated: true)

3
Вам потрібно додати трохи вмісту навколо своєї відповіді та трохи пояснити це.
Горобець

1

На додаток до гарних відповідей вище, щоб встановити контролер перегляду навігації у верхній частині екрана програми, ви можете додати його до свого файлу AppDelegate.swift усередині блоку наступним чином

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = UINavigationController(rootViewController: LoginViewController())

    return true

}

1

Свіфт 4.0.3

 @IBAction func registerNewUserButtonTapped(_ sender: Any) {

        print("---------------------------registerNewUserButtonTapped --------------------------- ");

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

        let nextViewController = storyBoard.instantiateViewController(withIdentifier: "RegisterNewUserViewController") as! RegisterNewUserViewController
        self.present(nextViewController, animated:true, completion:nil)

    }

Змініть наше ім’я контролера RegisterNewUserViewController


Має бутиstoryboard
Лукас

1

Я думаю, ви шукаєте щось подібне:

let signUpViewController = SignUpViewController()
present(signUpViewController, animated: true, completion: nil)

Якщо ви хочете повноекранний режим нової сторінки:

present(signUpViewController, animated: true, completion: nil)

Сподіваюся, це допомагає :)


0

Я не впевнений, спробуйте нижче кроки, я думаю, що помилка трапляється нижче причин.

  • ви перейменовуєте деякі файли за межами XCode. Для її вирішення видаліть файли з проекту та повторно імпортуйте файли у своєму проекті.
  • перевірити та додати відсутні файл Nib у Фази збірки-> Копіювати ресурси пакета. остаточно перевірити написання імені перо, воно правильне, чутливий до регістру.
  • перевірте властивості файлів .xib / storyboard в інспекторі файлів, властивість " Цільове членство " на полі вибору, тоді ваш файл xib / storyboard був зв’язаний з вашим цільовим.
  • наприклад, неправильний тип NIB. Клацніть правою кнопкою миші на файлі та натисніть "Отримати інформацію", щоб переконатися, що тип відповідає вашому очікуванню.

0
 let vc = DetailUserViewController()
 vc.userdetails = userViewModels[indexPath.row]
 self.navigationController?.pushViewController(vc, animated: true)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.