View Controllerが2つあります。 view controller1には次のものがあります。
私のコードでは、ボタンを押すアクションについて次のものがあります
@IBAction func buttonPress(sender: AnyObject) {
println("button pressed")
performSegueWithIdentifier("showme", sender: self)
}
また、次の方法があります:
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
println("Should performing....")
return true
}
何らかの理由でshouldPerformSegueWithIdentifier関数が呼び出されることはありません。ただし、セグエをUIButtonで直接ViewController2に追加する場合はそうです。
ボタンアクション内で方向を呼び出すことは機能することを確認しました(以下を参照)が、これが機能する方法であると理解していることではありません。 prepareforSegueについても同様です。
@IBAction func buttonPress(sender: AnyObject) {
println("button pressed")
if (shouldPerformSegueWithIdentifier("showme", sender: self)){
performSegueWithIdentifier("showme", sender: self)}
}
次の理由により、この動作は完全に自然です。
1)shouldPerformSegueWithIdentifier
は、Storyboardsで設定されたセグエがトリガーされるようにするために使用されるため、Storyboard Seguesの場合にのみ呼び出され、not実際にセグエを実行します。
2)performSegueWithIdentifier
を自分で呼び出すとき、shouldPerformSegueWithIdentifier
はnotと呼ばれます。やっている。 performSegueWithIdentifier
を呼び出しても意味はありませんが、NO
からshouldPerformSegueWithIdentifier
を返します。
@nburkの答えは絶対に正しいです。
ただし、shouldPerformSegueWithIdentifier:sender:
への呼び出しがコード内で行われた場合でも、performSegueWithIdentifier:sender:
が呼び出されると、状況によっては役立つ場合があることを理解しています。
たとえば、セグエを実行するかどうかを決定するためにいくつかの検証を行い、このロジックを単一の場所に保持し、次のような場所の条件全体に複製しないようにします。
if (self.shouldPerformSegue) {
[self performSegueWithIdentifier:identifier sender:sender];
}
これは、次のようにperformSegueWithIdentifier:sender:
をオーバーライドすることで簡単に実現できます。
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
if ([self shouldPerformSegueWithIdentifier:identifier sender:sender]) {
[super performSegueWithIdentifier:identifier sender:sender];
}
// otherwise do nothing
}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
return self.shouldPerformSegue;
}
このようにして、shouldPerformSegueWithIdentifier:sender:
を使用して、IBとコードトリガーセグエの両方を許可/拒否するロジックを定義できます。
上記の答えとして。 performSegueWithIdentifier
を呼び出すと、shouldPerformSegueWithIdentifier
は呼び出されません。
例として:
スワイプできる画像を表示するために、コンテナビュー内にセグエが埋め込まれているとします。また、VCが読み込まれたときに埋め込みセグエがすぐに起動します。ただし、リモートAPIから画像をダウンロードする必要がある場合、埋め込みに表示する画像がないため、アプリがクラッシュしますセグエ/コンテナビュー。
この場合、shouldPerformSegueWithIdentifier
が必要になります。
Falseがfalseを返し、セグエが発生しない場合は、shouldPerformSegueWithIdentifier
でチェックインするブール値を設定できます。そして、アプリが画像をダウンロードしたら、performSegueWithIdentifierを呼び出すことができます
完璧なソリューションをありがとう@tanzolone。 Swift 5のコードを書き直しました。
shouldPerformSegue
の前にperformingSegue
を強制的に呼び出すには、クラスでperformingSegue
をオーバーライドできます。
override func performSegue(withIdentifier identifier: String, sender: Any?) {
if shouldPerformSegue(withIdentifier: identifier, sender: sender) {
super.performSegue(withIdentifier: identifier, sender: sender)
}
}
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
// Your code (return true if you want to perform the segue)
}
このコードを使用している場合は、削除する必要があります。
[self performSegueWithIdentifier:name sender:sender];