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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With