Ios 当我在没有使用performSegueWithIdentifier的情况下单击按钮时,prepareForSegue不会被调用
基于斯坦福iOS课程,我正在玩模态视图控制器。在演示中,他们有一个按钮,可以启动一个模态视图,单击该按钮时,将调用函数prepareForSegue。我在我的项目中模拟了代码和实现,唯一的区别是我的演示在iPhone情节串连板上,他们的演示在iPad上 我注意到,当我的模态视图控制器出现时,在此之前它不会调用prepareForSegue。在调用prepareForSegue之前,我搜索了斯坦福项目,看看他们可能在哪里记录任何segue行为,但没有证据。有人能解释一下吗。我搜索了stack overflow,只发现用户缺少performSegueWithIdentifier的调用实现。然而,在斯坦福大学的演示中,他们从来没有这样做过Ios 当我在没有使用performSegueWithIdentifier的情况下单击按钮时,prepareForSegue不会被调用,ios,iphone,objective-c,segue,uistoryboardsegue,Ios,Iphone,Objective C,Segue,Uistoryboardsegue,基于斯坦福iOS课程,我正在玩模态视图控制器。在演示中,他们有一个按钮,可以启动一个模态视图,单击该按钮时,将调用函数prepareForSegue。我在我的项目中模拟了代码和实现,唯一的区别是我的演示在iPhone情节串连板上,他们的演示在iPad上 我注意到,当我的模态视图控制器出现时,在此之前它不会调用prepareForSegue。在调用prepareForSegue之前,我搜索了斯坦福项目,看看他们可能在哪里记录任何segue行为,但没有证据。有人能解释一下吗。我搜索了stack ov
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier hasPrefix:@"Create Label"]) {
AskerViewController *asker = (AskerViewController *)segue.destinationViewController;
asker.question = @"What do you want your label to say?";
asker.answer = @"Label Text";
asker.delegate = self;
}
}
下面是一个故事板示例:
以下是我的故事板示例:
在调试器中,当我在Stanford演示代码中停止时,调用堆栈显示序列图像板正在执行一个segue操作,我需要在序列图像板中配置什么才能获得相同的结果?
事实证明,button调用模态视图的视图控制器没有实现PrepareForsgue的正确类。它是默认的UIViewController,而不是我的自定义类
我的解决方法是在viewDidLoad中放置断点,即使它没有中断,因此我怀疑在故事板中,我没有与实现按钮的视图关联的正确类。代码下面的模式或按钮序列将始终被调用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Create Label"]) {
SignUpViewController *asker = segue.destinationViewController;
}
}
首先,您必须在按钮上选择并按住ctrl键拖动项目,以查看控制器并选择选择segue。然后,您必须正确命名segue标识符 不要将一个视图控制器连接到另一个视图控制器。 为此导入UIKit.framework 然后将调用此方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"identifierName"])
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
ExampleViewController *destViewController = segue.destinationViewController;
}
}
在为表视图连接自动segue时,除了Amro的答案(不分配相应的子类)之外,还有两种情况下,
prepareforsgue
可能不会被调用。确保您已经:
[单击图像放大]我在使用
UICollectionViewCell
作为segue的源时遇到了类似的问题。似乎要使故事板序列正常工作(没有
performsguewithidentifier
),需要有一个自定义子类UICollectionViewCell
,并将其用作故事板上CollectionViewCell
的类 在我的例子中,我没有在包含segue的视图控制器的故事板中以类的名称设置模块。它被设置为无,一旦我在模块字段中单击,它就设置为正确的项目/模块并解决了问题。我也遇到了类似的问题
思考过程是:
确保您具有正确的方法签名。它在Swift 3中发生了变化
然后确保你连接按钮的方式(或触发segue的任何方式)与你在故事板中连接segue的方式相匹配。有时您调用一个按钮,但尚未将该按钮的序列正确连接到目标viewcontroller
确保序列的标识符正确无误。虽然这不是prepareForSegue没有被调用的原因,但这只是特定segue没有被调用的原因
在我的例子中,之所以出现这种情况,是因为我的控制器扩展了另一个控制器(Eureka Form View controller=FormViewController),该控制器实现了以下performsgue函数:
open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
我的功能是这样实现的:
open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
为了解决这个问题,我刚刚添加了覆盖:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
瞧 在我的例子中,我的项目中有几个视图控制器的基类。该基类有一个prepareforsgue()
的实现,并不是在所有情况下都被调用。问题是,在我从基类继承并重写其prepareforsgue()
实现的一个视图控制器中,我忘了调用super.prepareforsgue()
,以解决此问题,如果您现在使用的是Swift 3,则以下函数不会抛出错误,因为这是正确的语法,但它不会工作,因为它是Swift 2函数:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// code
}
您必须更新到Swift 3“准备”功能,才能使其用于分段:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
您如何知道未调用prepareforsgue:
?我敢打赌,它正在被呼叫。确保的唯一方法是在其中的第一条语句上设置断点。你做到了吗?是的,我做到了,这就是我问这个问题的原因。在我的演示中,没有调用我的预变形,但在斯坦福演示中调用了。做得好。你学到了一些重要的东西!这是一个容易犯的错误,你会犯很多次。:)我不愿承认,我以前犯过这个错误。真不敢相信我花了一段时间才弄明白这件事!不,它不总是从UITableViews导航对我来说,我尝试使用另一个我知道有效的segue,但我必须重新创建它。虽然处理得很好,但当Swift 2方法不兼容且在Swift 3中表现不明显时,苹果发出的某种警告或错误可能会有所帮助。不幸的是,事实并非如此,谢谢你的回答,它起作用了,谢谢!最有帮助的+1辅助动作是关于ⓘ代码>或﹥代码>,等等。有关更多信息,请参阅