Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Push view: while an existing transition or presentation is occurring; the navigation stack will not be updated

Tags:

xcode

ios

swift

I'm receiving this error when trying to push a view controller. i've got a segue attached from table cell, pushViewController:animated: called on while an existing transition or presentation is occurring; the navigation stack will not be updated.

class PlaylistsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate {
let ItemRecordName = "Playlists"
var playlists = NSMutableArray()
@IBOutlet var tableView: UITableView?
var cloudm = CloudManager()
var container: CKContainer?
var publicDatabase: CKDatabase?
var edgePan = UIScreenEdgePanGestureRecognizer()



override func viewDidLoad() {
    super.viewDidLoad()


    self.setUpMenu()
    container = CKContainer.defaultContainer()
    publicDatabase = container?.privateCloudDatabase

    self.tableView!.contentInset = UIEdgeInsetsMake(64, 0, 0, 0)

}
func setUpMenu() {

    self.slidingViewController().topViewAnchoredGesture = ECSlidingViewControllerAnchoredGesture.Panning |  ECSlidingViewControllerAnchoredGesture.Tapping

    //self.navigationController.view.addGestureRecognizer(self.slidingViewController().panGesture)
    edgePan = UIScreenEdgePanGestureRecognizer(target: self, action: "menuButtonTapped")
   edgePan.edges = UIRectEdge.Left
    edgePan.delegate = self
    self.navigationController.view.addGestureRecognizer(edgePan)


    self.navigationController.navigationBar.translucent = true

    let icon = FAKIonIcons.naviconIconWithSize(40)
    icon.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor())
    let iconImage = icon.imageWithSize(CGSizeMake(40, 40))

    let plusicon = FAKIonIcons.ios7PlusEmptyIconWithSize(30)
    plusicon.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor())
    let plusiconImage = plusicon.imageWithSize(CGSizeMake(30, 30))

    let barButton = UIBarButtonItem(image: iconImage, style: UIBarButtonItemStyle.Plain, target: self, action: "menuButtonTapped")
    let barButton2 = UIBarButtonItem(image: plusiconImage, style: UIBarButtonItemStyle.Plain, target: self, action: "openNameForPlaylist")
    barButton2.tag = 1
    let negativeSpacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
    let negativeSpacer2 = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
    negativeSpacer.width = -10
    negativeSpacer2.width = 0.0

    self.navigationItem.leftBarButtonItems = NSArray(objects: negativeSpacer, barButton)
    self.navigationItem.rightBarButtonItems = NSArray(objects: negativeSpacer2, barButton2)

}
override func viewDidAppear(animated: Bool)  {
    self.getPlaylists()
}
func menuButtonTapped () {
    self.slidingViewController().anchorTopViewToRightAnimated(true)
}
func getPlaylists() {
    cloudm.fetchPlaylistNames("Playlists", completionHandler: {(records: NSMutableArray) -> Void in
        if records.count > 0 {
            println("got Playlists")
            self.playlists = records
            self.tableView?.reloadData()
            //self.noFoodLabelAlpa(0, withDuration: 0, withDelay: 0)


        } else {
            println("dont got Playlists")
            //self.noFoodLabelAlpa(1, withDuration: 1, withDelay: 1.8)
        }
        })

}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
func openNameForPlaylist() {
     var alert = UIAlertView(title: "Playlist Name", message: "Please choose a name for your Playlist",  delegate: self, cancelButtonTitle: "Done")
    alert.alertViewStyle = UIAlertViewStyle.PlainTextInput
    alert.show()
}
func alertView(alertView:UIAlertView, clickedButtonAtIndex buttonIndex: NSInteger){
println(alertView.textFieldAtIndex(0).text)
    addPlaylist(alertView.textFieldAtIndex(0).text)
}
func addPlaylist(name: String) {
    if playlists.count == 10 {
        var alert = UIAlertView(title: "Playlist is full", message: "You've reached the maximum number of songs in your playlist, to add more please remove some", delegate: self, cancelButtonTitle: "ok")
        alert.show()
    } else {
        println("playlist count = \(self.playlists.count)")
        var newRecord: CKRecord = CKRecord(recordType: ItemRecordName)
        //var playlistName = "Playlist \(self.playlists.count + 1)"
        newRecord.setObject(name, forKey: "playlistName")
        self.cloudm.saveRecord(newRecord)

        self.playlists.insertObject(newRecord, atIndex: 0)
        //self.playlists.addObject(newRecord)
        self.playlists.sortUsingDescriptors([NSSortDescriptor(key: "playlistName", ascending: true)])
        var indexPath = NSIndexPath(forRow: 0, inSection: 0)
        self.tableView?.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)


    }
}
func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
    return 1;
}
func tableView(tableView: UITableView!, heightForHeaderInSection section: Int) -> Int {
    return 1
}
func tableView(tableView: UITableView!, viewForFooterInSection section: Int) -> UIView {
    var view = UIView(frame: CGRect.zeroRect)
    return view
}


func tableView(tableView: UITableView!, heightForFootInSection section: Int) -> Int {
    return 1
}

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    return playlists.count
}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
    let CellIndentifier: NSString = "playlistCell"

    var cell : UITableViewCell  = tableView.dequeueReusableCellWithIdentifier(CellIndentifier) as UITableViewCell
    var selectedView = UIView(frame: CGRectMake(0,0,cell.contentView.frame.size.width, cell.contentView.frame.size.height))
    cell.selectedBackgroundView = selectedView


    cell.backgroundColor = UIColor.clearColor()


    var records: CKRecord = self.playlists[indexPath.row] as CKRecord
    var playlist:String = records.objectForKey("playlistName") as String
    println("Playlists are \(playlist)")

    cell.textLabel.text = playlist


    return cell
}
func tableView(tableView: UITableView?, canEditRowAtIndexPath indexPath: NSIndexPath?) -> Bool {
    // Return NO if you do not want the specified item to be editable.
    return true
}

func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        self.cloudm.deleteRecord(self.playlists[indexPath.row] as CKRecord)
        self.playlists.removeObjectAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}

func tableView(tableView: UITableView!, didEndEditingRowAtIndexPath indexPath: NSIndexPath!) {
    if playlists.count > 0 {
        //self.noFoodLabelAlpa(0, withDuration: 0, withDelay: 0)

    } else {
        //self.noFoodLabelAlpa(1, withDuration: 1, withDelay: 0)
    }
}
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)  {
    var indexPath = self.tableView!.indexPathForSelectedRow()
    var record: CKRecord = self.playlists[indexPath.row] as CKRecord
    let playlistOpen: PlaylistsOpenViewController = segue.destinationViewController as PlaylistsOpenViewController
    playlistOpen.parentRecordID = record.recordID.recordName
    playlistOpen.cloudm = self.cloudm

}

}

UPDATE: Ok so i've installed xcode beta 5, and now both the simulator and my phone are receiving this error, which did not exist prior to this release.. any ideas at all?

like image 386
bevbomb Avatar asked Aug 05 '14 05:08

bevbomb


1 Answers

This appears to be a bug in ECSlidingView which it appears you are using. See their issue tracker. There is a workaround which helps for some scenarios but it won't help you here I'm afraid. All we can do now is wait for a patch or for Apple to unbreak what they broke in Beta 5.

I decided to throw everything ECSliding related out the window and start over using SWRevealViewController. The switch was surprisingly pain-free, took me about one hour of work for an app with some 20K LOC. This is what I recommend to anyone encountering this problem.

There is a fix merged into the master branch now. I'll post it here as well for reference, it was provided by SpruceGoose429 and appended by fcy on Github:

In ECSlidingViewController.m replace the following code:

- (id<UIViewControllerTransitionCoordinator>)transitionCoordinator {
    return self;
}

With this block:

- (id<UIViewControllerTransitionCoordinator>)transitionCoordinator
{
    // Return self if a transition is in progress (we're the transition coordinator).
    // Otherwise, defer to super.
    return ((_transitionInProgress)? self: [super transitionCoordinator]);
}

As I mentioned this fix is in version 2.0.3 of ECSlidingViewController.

like image 191
Rick Avatar answered Oct 12 '22 22:10

Rick