我有一个简单的表视图,我在表视图上处理select操作。此操作遵循segue。
如果segue是push
segue,则立即显示下一个视图。
如果segue是modal
segue,则下一个视图:
我试着寻找一些想法,但似乎没有一个适用于我的情况。特别是:
viewDidLoad
中没有问题)。此外,当segue为push
时,它显示近乎瞬时显示加载目标视图没有问题nil
传递给sender
;同样的效果。有没有人对此有任何想法?
答案 0 :(得分:89)
相信我,试一试。我曾经遇到过这个问题几次。
在Swift 2中:
dispatch_async(dispatch_get_main_queue(),{
self.performSegue(withIdentifier:mysegueIdentifier,sender: self)
})
或Swift 3:
DispatchQueue.main.async {
self.performSegue(withIdentifier: mysegueIdentifier,sender: self)
}
答案 1 :(得分:5)
似乎(对我来说......)只有当单元格selectionType
不是.none
时才会出现此问题。
您可以将其更改为任何其他选项(在故事板Attribute inspector
,设置Selection
字段),它将正常工作(为我工作......)。
缺点是它弄乱了单元格UI。
您可以在人DispatchQueue.main.async{}
的{{1}}代理函数中didSelect
阻止UITableViewDelegate
块中的segue。
我使用了第一种解决方案并在细胞本身添加了
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(false, animated: false)
}
这将使细胞突出显示'在水龙头,但它会立即返回其通常的用户界面,对我来说很好......
答案 2 :(得分:3)
执行segue时,似乎有各种情况无法正常工作。例如,如果从unwind segue的动作处理程序中调用performSegue
,即使您在主线程上,也会遇到各种问题。在我当前的项目中,我从表视图的performSegue
方法调用didSelectRowAt
。这是最基本的部分之一,当然我是主线程,但我看到了OP所描述的确切症状。
我不知道为什么在某些情况下会发生这种情况,而不是其他情况,但我发现使用performSegue
延迟async
来电可以解决任何潜在问题。这曾经看起来像一个黑客并让我感到紧张,但在这一点上,我有几个成熟的项目使用这种方法,现在看起来像#34;对"做手动的方式。
以下是Swift 3版本的代码(请参阅Swift 2和Obj-C版本的其他帖子):
DispatchQueue.main.async {
self.performSegue(withIdentifier: "theIdentifier", sender: theSender)
}
答案 3 :(得分:2)
接受的解决方案对我有用。代码更新于下面的Swift 2.0:
dispatch_async(dispatch_get_main_queue(),{
self.performSegueWithIdentifier(mysegueIdentifier, sender:self)
})
答案 4 :(得分:1)
希望帮助这个你可以在Swift中创建这样的程序模态转换:
Dim ctl As Control
For Each ctl In Me.Controls
If TypeOf ctl Is MdiClient Then
ctl.BackColor = Color.Yellow
ctl.BackgroundImageLayout = ImageLayout.Stretch
ctl.BackgroundImage = Image.FromFile("C:\Image.png")
End If
Next
答案 5 :(得分:1)
对于通过子类化来组织代码的开发人员,我已经找到了一个非常简单的解决方案,我想分享(Swift 4):
import UIKit
class ABCViewController: UIViewController {
// ... Other useful methods like overriding deinit and didReceiveMemoryWarning
// Performs a segue on the main thread to ensure it will
// transition once a UI-slot is available
func performSegueOnMainThread(with identifier: String, sender: Any?) {
DispatchQueue.main.async {
self.performSegue(with: identifier, sender: sender)
}
}
}
然后,只需从您的实现中调用它:
myViewController.performSegueOnMainThread(with: "ShowDetailsSegue", sender: self)
答案 6 :(得分:0)
对我来说,下一个视图中有太多“清除”彩色视图,因此当对动画进行动画处理时,它似乎因此而延迟。我遍历了视图控制器的UI层次结构,以寻找清晰的颜色并将其替换为纯黑色或白色,并确保alpha为1(如果不需要,则为1)。我的延迟现在消失了,模态演示也很顺利。
答案 7 :(得分:-1)
我尝试修复这种方法,包括将其移动到上面的主线程。这对我有用:
在故事板中,选择有问题的表格视图,(在文档大纲中选择它以确保您有正确的东西。然后在属性检查器中,您将能够看到表格视图的属性以及在它下面包含scrollview(所有的表视图都基于滚动视图)。这里有一个叫做“延迟内容触摸”的愚蠢的小盒子。取消选中它。还有一个“允许可取消的触摸”,我想你想要制作它肯定也是不受限制的,因为我认为双重打击让我搞砸了。