ナビゲーションバーボタンをXcode 6のViewControllerのExitアイテムに接続しようとすると(Xcode 6の問題かどうかは確かではありませんが、ベータ版なので言及する価値があります)、Swift関数が見つかりませんカスタムクラス。
見つけるべき関数:
@IBAction func unwindToList(segue: UIStoryboardSegue) {
}
Swiftで動作するIBActionを取得し、正しく記述していることを確認するために、ビューに別のボタンを作成しました。これはうまくいきます:
@IBAction func test(sender: AnyObject) {
NSLog("Test")
}
この質問 を見たことがありますが、同じ問題のように見えますが、答えによれば、これは機能するはずです。
Xcode 6はベータ版であり、もちろんSwiftは非常に新しいものですが、潜在的なバグであると考える前にこれに遭遇したかどうかを確認したかったのです。
これはXcode 6の既知の問題です。
SwiftクラスはInterface Builderで認識されません
それを回避するには、以下を行う必要があります。
class MyViewController
_を@objc(MyViewController) class MyViewController
に変更しますセグエアクションを再宣言するMyViewControllerのカテゴリを持つObjective-Cヘッダーファイルを作成します。
_@interface MyViewController (Workaround)
- (IBAction)unwindToMyViewController: (UIStoryboardSegue *)segue;
@end
_
ストーリーボードで、MyViewControllerのインスタンスを選択し、そのカスタムクラスをクリアしてから、MyViewControllerに戻します。
これらの手順を実行すると、ボタンを終了アイテムに再度接続できます。
Xcode 6リリースノートPDF、ページ10
Objective-Cの回避策を使用する代わりに、現在インストールできるXcode 6 Beta 4は、Interface Builderでのアンワインドセグエの接続をサポートしています。 iOS Devセンターから今すぐ更新できます。 Controlキーを押しながらクリックしてセグエをトリガーするUI項目から終了アイコンにドラッグし、次のコードを宛先View Controllerに配置した後、関数unwindToSegueを選択します。
@IBAction func unwindToSegue (segue : UIStoryboardSegue) {}
ようやく機能するようになりました。 xcode6 IBは現在非常に脆弱です(多くのクラッシュもします)。ナビゲーションバーボタンアイテムを終了アイテムに接続する前にIDEを再起動する必要がありました。テストプロジェクトを再作成し、上記の提案(Xcode 6リリースノートPDF、さらに、.hファイルを追加するときに、プロジェクトターゲットを選択するようにしましたが、デフォルトではチェックされていませんでした。また、コントローラーSwift=スタブを作成しましたCocoa Touch Classテンプレートを介して(vs empty Swift file)。navコントローラーでモーダルセグエを使用しました。
ListTableViewController.h
#import <UIKit/UIKit.h>
@interface ListTableViewController
- (IBAction)unwindToList: (UIStoryboardSegue *)segue;
@end
ListTableViewController.Swift
import UIKit
@objc(ListTableViewController) class ListTableViewController: UITableViewController {
@IBAction func unwindToList(s:UIStoryboardSegue) {
println("hello world");
}
}
それが役立つことを願って
ダウンロード可能なXcode 6 Beta 4では、セグエの巻き戻しとインターフェイスビルダーがサポートされています。私はそれを小さなプロジェクトで自分でテストしました。
In Swift 2.3パラメーターの外部名は「withUnwindSegue」である必要があります。
@IBAction func unwindToThisView(withUnwindSegue unwindSegue: UIStoryboardSegue) {
...
}
Xcode 6.1はこの問題を修正したようです。次のコードを使用して、Swiftでアンワインドセグエを設定できるようになりました。
@IBAction func unwindToList(segue: UIStoryboardSegue) {
// Nothing needed here, maybe a log statement
// print("\(segue)")
}
このメソッドは空のままでも構いませんが、UIStoryboardSegueタイプのメソッドシグネチャが必要であり、AnyObjectやInterface Builderには表示されません。
詳細については、 TechNote 2298 を確認してください。
常に同じプレゼンテーションビューコントローラーを使用する場合は、次の操作をいつでも実行できます。
self.navigationController?.popViewControllerAnimated(true)
最初にXcode Beta 4でも同じ問題が発生しました。気付くまで、それぞれのコントローラーの[キャンセル]ボタンと[保存]ボタンに@IBOutletを追加するのを忘れていました。この後、ボタンをExit-Iconに接続できました:))
巻き戻そうとしている元のコントローラーの宛先がContainerオブジェクト内に埋め込まれていないことを確認することができます。 Xcode 6にはありません。
上記の答えは問題を解決するためにObjCに依存していますが、私は純粋なSwift=ソリューション。Swift Interface Builder(Xcode 6.3)でセグエ、ハンドラーが呼び出されていませんでした。
@IBAction func unwindToParent(sender: UIStoryboardSegue) {
dismissViewControllerAnimated(true, completion: nil)
}
そのため、掘り下げた後、スーパークラスからのcanPerformUnwindSegueAction:fromViewController:withSender
はfalse
を返します。だから私は実装をオーバーライドしました、そしてそれは動作します:
override func canPerformUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject) -> Bool {
return action == Selector("unwindToParent:")
}
更新canPerformUnwindSegueAction:fromViewController:withSender
をオーバーライドせずに問題を解決したため、上記のコードは正しくありません。基本的なエラーは、presentingviewcontrollerとpresentedviewcontrollerを区別することでした。
巻き戻しセグエが開始されると、まず、巻き戻しセグエが作成されたときに指定された巻き戻しアクションを実装するナビゲーション階層で最も近いView Controllerを見つける必要があります。このView Controllerは、巻き戻しセグエの宛先になります。適切なView Controllerが見つからない場合、巻き戻しセグエは中止されます。
出典: テクニカルノートTN2298
したがって、@IBAction
は、提示されたView Controllerではなく、提示されたViewControllerで定義します。そうすれば、セグエはプロパティdestinationViewController
およびsourceViewController
にも意味のある値を持ち、それぞれ表示および表示されたViewControllerになります。
Xcode --version 6.4 Swift 1.2
@IBAction func backButton(sender:AnyObject){dismissViewControllerAnimated(true、completion:nil)}