2014-12-09 3 views
51

У меня появилось сообщение об ошибке при навигации с контроллера первого взгляда на контроллер второго представления. Мое кодирование как этотПрограммный переход на другой контроллер/сцену просмотра

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) 
+0

Вы должны добавить 'LoginViewController. xib' в вашем проекте. Когда вы создаете 'LoginViewController.swift', убедитесь, что включен xib. – gabbler

+0

уже привязаны к нему –

+0

Попробуйте добавить полный новый контроллер представления и подставить 'LoginViewController' и посмотреть, работает ли он. – gabbler

ответ

92

я уже нашел ответ

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

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

Изнутри ViewController вы можете получить доступ к раскадровке, используя self.StoryBoard –

+0

Спасибо, что решить мою проблему! –

+2

скрывает «навигационную панель» – Danny182

36

Попробуйте это. Здесь «LoginViewController» - это идентификатор раскадровки, указанный в раскадровке.

Ниже

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

такое же сообщение об ошибке .. –

+0

Я был удивлен, что ответ Нурдина был предложен для работы (а это не так), потому что это было просто вызов толчка. Это, конечно, СМОТРЕТЬ, как будто он должен работать, так как мы имеем дело с контроллером навигации – Sirens

0

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

  • Вы переименовываете некоторые файлы за пределы XCode. Чтобы решить проблему, удалите файлы из своего проекта и повторно импортируйте файлы в свой проект.
  • проверить и добавить отсутствующий файл Nib в Сборка фаз-> Скопировать ресурсы пакета. Завершить проверку орфографии имени ниба, это правильно, с учетом регистра.
  • проверить свойства .xib/раскадровку файлов в файла инспектор, свойство «Target Членство» шаг на поле выбора, то ваш XIB/раскадровку файл был связан с вашей целью.
  • , например неправильный тип NIB.Right, щелкните по файлу и нажмите «Получить информацию», чтобы убедиться, что тип является тем, что вы ожидаете.
+0

, который не работает вообще. –

5

Swift3:

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

Попробуйте это. Вы просто смутили nib с представлением раскадровки.

1

Я предоставляю вам свой код для перехода. В этом примере действие подключается к UIButton. Поэтому не забудьте установить его. Не забудьте указать имя вашего ViewController в методе transition.

Не забудьте также установить раскладку. Вам нужно иметь один вид на viewController. Подключите каждый ViewController к каждому виду в storyBoard. Вы можете увидеть на screenshoot сильфонные

enter image description here enter image description here

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 
    }) 
} 
} 
10

Смотри мои.

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

Если вы используете стиль представления, вы можете потерять навигационную панель страницы с заданной pushnavigation.

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. Это показано ниже:

Screenshot for how to set storyboardID

8

Если вы хотите, чтобы перейти к контроллеру создан Программным, то сделать это:

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

Если вы хотите, чтобы перейти к контроллеру на раскадровке с идентификатором «newViewController» , то сделать это:

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

Xcode 8.2 СВИФТ 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 Identifier, следуя следующим шагам:

  • Выберите Main.storyboard
  • Селе кт вашего UIViewController
  • Поиск утилит в правой
  • Выберите инспектор тождественного
  • Поиска в идентичности раздела "Раскадровка ID"
  • Поместите идентификатор для вашего UIViewController

enter image description here

+0

Настоящий ответ, я проголосовал, но зачем нам «Восстановить ID»? Я считаю, что для этой ситуации достаточно «Storyboard ID». –

+0

Благодарим за отзыв @yucelbayram Идентификатор восстановления - это строка, которую необходимо назначить любому контроллеру или представлению, который вы хотите сохранить и восстановить. В моем случае я использую это поле, потому что мне нужна определенная функция, но если вы не нуждаетесь в ней, ее можно удалить. –

0

Если вы создаете пользовательский интерфейс без перетаскивания (без использования раскадровки) и хотите перейти по странице по умолчанию или 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) 
} 

Держите одно, что я забыл в главном.раскадровка есть сцена со стрелкой, выберите эту стрелку и нажмите кнопку удаления

Теперь перетащите навигационный контроллер и удалите табличное представление, которое поставляется с контроллером навигации. выберите команду управления навигационным контроллером на клавиатуре и перетащите ее в другую сцену на раскадровке, которая является ViewController. Это означает, что ваш ViewController суперпользователя ViewController надежда это поможет вам Благодаря в main.storyboard, перетаскивание navigationcontroller,

1

Вы можете сделать навигацию между контроллерами зрения с использованием кода с помощью раскадровки и storyboardId в представлении контроллер. Этот код для Swift 3:

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

Есть ли какое-либо введение или объяснение, которое вы можете придумать для кода в своем ответе? Возможно, первое предложение типа «Я думаю, что вам нужен такой код:». –

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

Вам нужно добавить контент вокруг своего ответа и немного объяснить его. – Sparrow

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

В дополнение к хорошим ответам выше, чтобы установить контроллер представления навигации в верхней части экрана на вашем приложении, вы можете добавить его в ваш AppDelegate.swift файла внутри блока следующим

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

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

    return true 

} 
-1

Xcode 9.2 и Свифта 3.0 ViewController к NextViewcontroller без Se GUE соединения

пусть раскадровке: UIStoryboard = UIStoryboard (название: "Main", расслоение: ноль) пусть nextViewController = storyBoard.instantiateViewController (withIdentifier: "NextViewController"), как! ? NextViewController self.navigationController .pushViewController (nextViewController, анимированные: правда)

или

пусть VC: NextViewController = раскадровка .instantiateViewController (withIdentifier: "NextViewController") как! ? NextViewController self.navigationController .pushViewController (VC, анимированные: правда)

0

Swift 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

Смежные вопросы