从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)

Posted

技术标签:

【中文标题】从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)【英文标题】:Segueing from a UINavigationController to another UINavigationController (Swift iOS 9, xcode 7) 【发布时间】:2016-01-28 19:01:46 【问题描述】:

作为 ios 开发的新手,我很好奇在我需要根据某些条件从初始 UINavigationController 分支到另一个 UINavigationController 的情况下,最好的方法是什么。例如,当用户第一次启动应用程序时,我想呈现“创建帐户”系列屏幕(我需要有多个屏幕)。但是,如果它们已经被激活,我希望能够分支到另一个 UINavigationController,它的根视图控制器是密码输入屏幕,后面还有更多屏幕。人们是怎么做这种事情的?我尝试将代码放在主导航控制器的 viewDidLoad() 方法中,然后在检查条件后调用 performSegueWithIdentifier(例如,密码是否存在),但是当我继续时,我得到一个空白屏幕,因为它显示的是另一个 UINavigationController 而不是根控制器它指向。我究竟做错了什么?我真的没有任何代码要显示,只是想举个例子,或者是否有首选的方法来做这种事情。

难道我不能做这样的事情吗?

【问题讨论】:

【参考方案1】:

在应用程序启动时,检查帐户是否已创建/登录,如果是,则创建 Home 导航控制器并将其设置为rootViewController。如果没有,请创建 CreateAccount 导航控制器并将其设置为rootViewController

在帐户创建流程的最后,您可以在 CreateAccount 导航控制器的顶部显示 Home 导航控制器模态。这不是什么大问题,因为在下次启动时,您将只实例化 Home 导航控制器。

这就是我要说的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // ...
    UIViewController *rootController = nil;
    BOOL showCreateAccount = NO; // this should come from some storage e.g. NSUserDefaults
    if(showCreateAccount == NO)
    
        rootController = homeController; // create homeController 
    
    else
    
        rootController = createAccountController; // create createAccountController
    

    NSAssert(rootController, @"no user interface, what is this? a web service??");
    self.window.rootViewController = rootController;
    [self.window makeKeyAndVisible];
    return YES;

如果您真的想从视图层次结构中删除 CreateAccount 控制器并将其替换为 Home 控制器,您应该创建一个自定义 segue。 This *** Question 应该可以帮助您入门。

【讨论】:

所以这不能在一个故事板中?我看到你正在分支到故事板,但我假设它可以通过从主导航控制器简单地分支到另一个来轻松完成,不是吗? 使用多个情节提要是保持单独界面流分开的好习惯,我已修改代码以删除对情节提要的引用。您可以随心所欲地创建这些控制器(无论是在同一个故事板中还是在不同的故事板中或在 Xibs 中) 我希望能够使用导航控制器,因为帐户创建和密码输入有一系列需要返回按钮、相同导航栏、样式等的屏幕。 这正是我要说的。在上面的例子中,我假设createAccountControllerhomeController 都是导航控制器。究竟是什么令人困惑? 我添加了一个概念截图。看起来这应该很简单。我怎样才能让它工作而不必像你的例子那样交换根控制器?故事板允许我这样做,所以它一定是可能的。提醒一下,这是在 xcode 7 中使用 swift。【参考方案2】:

这就是我让它在 Swift 中工作的方式:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.

    let activated = false || false
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let navController = activated ? "createAccount" : "enterPassword"

    let navViewController = storyboard.instantiateViewControllerWithIdentifier(navController) as! UINavigationController

    window?.rootViewController = navViewController
    window?.makeKeyAndVisible()

    return true

【讨论】:

【参考方案3】:

您可以在一个 VC 中完成所有这些工作。为例如创建手势识别器。向上滑动和向下滑动,然后为每个单独的设置使用开关盒。您可以轻松地为向上滑动添加计数器 +1,为向下滑动添加 -1,因此您甚至可以返回手势识别器。

然后您进行更改的方式是通过例如。在每种情况下为您的标签提供新文本

    switch swipeCounter 
      case 1: 
      label.text = "do this"
      funcForSomething()
      default:
      label.text = "do that"
      funcForSomethingElse()
   

这是一个更完整的示例,您可能可以使用 (Swift 2)

请注意,我声明了 var upSwipes,然后用于检查我在序列中的位置。查看我的“案例 0”的屏幕截图。

    var upSwipes = 0

  override func viewDidLoad() 
    super.viewDidLoad()

    self.openingText.alpha = 0.0
    self.swipeUp.alpha = 0.0

    let swipeRight = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
    swipeRight.direction = UISwipeGestureRecognizerDirection.Right
    self.view.addGestureRecognizer(swipeRight)

    let swipeUp = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
    swipeUp.direction = UISwipeGestureRecognizerDirection.Up
    self.view.addGestureRecognizer(swipeUp)

    let swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
    swipeDown.direction = UISwipeGestureRecognizerDirection.Down
    self.view.addGestureRecognizer(swipeDown)

  


 func respondToSwipeGesture(gesture: UIGestureRecognizer) 

    if let swipeGesture = gesture as? UISwipeGestureRecognizer 


      switch swipeGesture.direction 
      case UISwipeGestureRecognizerDirection.Down:
        print("minus 1")
        if upSwipes != 0  upSwipes = upSwipes - 1
      case UISwipeGestureRecognizerDirection.Up:
        print("plus 1")
              upSwipes = upSwipes + 1
      default: print("other direction")
      

        switch upSwipes 
        case 0:
          self.openingText.alpha = 0.0
          self.swipeUp.alpha = 0.0
          self.openingText.text = "Swipe up, not down you silly ?"
          self.openingText.alpha = 1.0
          self.swipeUp.alpha = 1.0
        case 1:
          self.openingText.alpha = 0.0
          self.swipeUp.alpha = 0.0
          self.openingText.text = "Case specific text. Please swipe up again."
          self.openingText.alpha = 1.0
          self.swipeUp.alpha = 1.0
          // Sequence to tell specifically why you need GPS permission and that in the next frame you will ask for it          
        case 2:
          self.openingText.alpha = 0.0
          self.swipeUp.alpha = 0.0
        //          initialAuthorization() // Your func to ask for GPS permission
          // Sequence to ask eg. GPS use permission
        case 3:
          self.openingText.alpha = 0.0
          self.swipeUp.alpha = 0.0
          self.openingText.text = "Case specific text. Please swipe up again."
          self.openingText.alpha = 1.0
          self.swipeUp.alpha = 1.0
          // Sequence to eg. ask name
        case 4:
          self.openingText.alpha = 0.0
          self.swipeUp.alpha = 0.0
          self.openingText.text = "Case specific text. Please swipe up again."
          self.openingText.alpha = 1.0
          self.swipeUp.alpha = 1.0
          // Sequence to eg. send verification email
        default:
          self.openingText.alpha = 0.0
          self.swipeUp.alpha = 0.0

            let vc = storyboard?.instantiateViewControllerWithIdentifier("initilizing-done") as! InitializingDoneViewController
            presentViewController(vc, animated: true, completion: nil)
          // Then finally you might choose to go to other view controller. You need file (Cocoa class) with the same name InitializingDoneViewController.swift and VC whose specification will then be used for this VC that is modally shown herein.
        
    

【讨论】:

以上是关于从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)的主要内容,如果未能解决你的问题,请参考以下文章

ID:[...] 的 NSManagedObject 已失效

iOS--app自定义相册--从自定义的相册中获取图片

将 managedObjectContext 发送到 viewController 崩溃

使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?

在 UINavigationController 中设置时图像不显示

UINavigationController - 何时释放推送的视图控制器等