performSegueWithIdentifier very slow when segue is modal

后端 未结 8 1747
天命终不由人
天命终不由人 2020-12-01 04:58

I have a simple table view where I handle the select action on the table view. This action follows a segue.

If the segue is a push segue, the next view

相关标签:
8条回答
  • 2020-12-01 05:28

    The accepted solution worked for me. Code updated for Swift 2.0 below:

    dispatch_async(dispatch_get_main_queue(),{
         self.performSegueWithIdentifier(mysegueIdentifier, sender:self)
    })
    
    0 讨论(0)
  • 2020-12-01 05:28

    Hope help this yo can create programatically modal transition like this in Swift:

           let myStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let modalViewController = myStoryboard.instantiateViewControllerWithIdentifier("myModalViewController") as! myModalViewController
            modalViewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
            let navController = UINavigationController(rootViewController: accountManager)
            dispatch_async(dispatch_get_main_queue(),{
                self.presentViewController(navController, animated: true, completion: nil)
            })
    
    0 讨论(0)
  • 2020-12-01 05:30

    Trust me and try this. I have run into this problem a few times.

    In Swift 2:

    dispatch_async(dispatch_get_main_queue(),{
        self.performSegue(withIdentifier:mysegueIdentifier,sender: self)
    })
    

    or for Swift 3:

    DispatchQueue.main.async {
        self.performSegue(withIdentifier: mysegueIdentifier,sender: self)
    }
    

    As discussed here and here.

    0 讨论(0)
  • 2020-12-01 05:30

    It seems (to me...) that this problem happens only when the cell selectionType is not .none.

    You may change it to any other option (at the storyboard Attribute inspector, set the Selection field) and it will work fine (working for me...). The cons is that it messing up the cell UI.

    You can call the segue in DispatchQueue.main.async{} block at the didSelect delegate function of UITableViewDelegate as people mention before.

    I used the first solution and added at the cell itself -

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(false, animated: false)
    }
    

    This will make the cell 'highlight' at the tap, but it will return to its usual UI immediately and it fine for me...

    0 讨论(0)
  • 2020-12-01 05:33

    For me it was the that I had too many "Clear" colored views in my next view, so when the segue was animated, it seemed like it was delaying because of this. I went through the view controller's UI hierarchy looking for clear colors and replacing them with solid black or white, and making sure the alpha is 1 (if it didn't need to be otherwise). My delay is now gone and my modal presentation is smooth.

    0 讨论(0)
  • 2020-12-01 05:38

    There seem to be various situations when performing a segue will not work properly. For example, if you call performSegue from the action handler of an unwind segue, you will run into various issues, even though you are on the main thread. On my current project, I am calling performSegue from the didSelectRowAt method of a table view. This is one of the most basic segues there is and of course I am on the main thread, yet I was seeing the exact symptoms that the OP described.

    I do not know why this happens in some cases and not others, but I have found that deferring the performSegue call using async fixes any potential issues. This used to seem like a hack and made me nervous, but at this point I have several mature projects using this approach and it now seems like the "right" way to do a manual segue.

    Here is the Swift 3 version of the code (see the other posts for Swift 2 and Obj-C versions):

    DispatchQueue.main.async {
        self.performSegue(withIdentifier: "theIdentifier", sender: theSender)
    }
    
    0 讨论(0)
提交回复
热议问题