xcode 推送视图:当现有的转换或演示正在发生时;导航堆栈不会更新
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25131737/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Push view: while an existing transition or presentation is occurring; the navigation stack will not be updated
提问by bevbomb
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.
尝试推送视图控制器时收到此错误。我从表格单元格中附加了一个 segue,pushViewController:animated: 在现有转换或演示发生时调用;导航堆栈不会更新。
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?
更新:好的,所以我已经安装了 xcode beta 5,现在模拟器和我的手机都收到了这个错误,这个错误在这个版本之前不存在......有什么想法吗?
采纳答案by Rick
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.
这似乎是ECSlidingView
您正在使用的错误。查看他们的问题跟踪器。有一种解决方法对某些情况有帮助,但恐怕在这里对您无济于事。我们现在所能做的就是等待补丁或 Apple 解开他们在 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.
我决定将与 ECSliding 相关的所有内容都扔出窗口,然后使用SWRevealViewController重新开始。切换过程出人意料地轻松,我花了大约一个小时的时间来开发一个具有大约 20K LOC 的应用程序。这是我向遇到此问题的任何人的建议。
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:
现在有一个修复合并到主分支。我也会在这里发布以供参考,它由 SpruceGoose429 提供并由 fcy 附加在 Github 上:
In
ECSlidingViewController.m
replace the following code:
在
ECSlidingViewController.m
替换以下代码:
- (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.
正如我提到的,此修复程序在 ECSlidingViewController 的 2.0.3 版中。
回答by VasanthRavichandran
I got the solution after spent an hour.Problem is to pop viewcontroller which is in the stack while showing any alert box in the current view controller. In iOS 8 and above they are not supporting like this. So you have to show an alert with ok or OKcancel. Then navigate or pop to any viewcontroller after getting the input button clicked. It works for sure.
花了一个小时后我得到了解决方案。问题是弹出堆栈中的视图控制器,同时在当前视图控制器中显示任何警报框。在 iOS 8 及更高版本中,它们不支持这样。因此,您必须显示带有 ok 或 OKcancel 的警报。然后在点击输入按钮后导航或弹出到任何视图控制器。它肯定有效。