[解決済み] Swift の performSegueWithIdentifier が動作しない。
質問
ユーザーがアカウントへのログインに成功した後、ビューコントローラーを切り替えようとしていますが、正しく動作しません。ログインボタンがクリックされると、情報が正しいかどうかにかかわらず、そのビューコントローラに移動してしまうので、セグエを直接使用することができません。知っている限りのことをすべて試しましたが、成功しませんでした。これは私が試しているコードです。
@IBAction func loginTapped(sender: AnyObject) {
let username = usernameField.text
let password = passwordField.text
if username.isEmpty || password.isEmpty {
var emptyFieldsError:UIAlertView = UIAlertView(title: "Please try again", message: "Please fill in all the fields we can get you logged in to your account.", delegate: self, cancelButtonTitle: "Try again")
emptyFieldsError.show()
}
PFUser.logInWithUsernameInBackground(username, password:password) {
(user: PFUser?, error: NSError?) -> Void in
if user != nil {
self.performSegueWithIdentifier("Klikur", sender: self)
} else {
if let errorString = error!.userInfo?["error"] as? String {
self.errorMessage = errorString
}
self.alertView("Please try again", message: "The username password combiation you have given us does not match our records, please try again.", buttonName: "Try again")
}
}
}
ストーリーボードIDを"Test"に設定していますが、正しい情報が入力されてもビューコントローラーが切り替わりません。どなたか、この問題を解決する手助けをしていただけませんか?
解決方法は?
[コードがクラッシュしているのではなく、セグメンテーションに失敗しているだけだと仮定して]。
少なくとも一つの問題は
self.performSegueWithIdentifier("Test", sender: self)
であるべきです。
dispatch_async(dispatch_get_main_queue()) {
[unowned self] in
self.performSegueWithIdentifier("Test", sender: self)
}
すべてのUI操作は、メインスレッドのキューで実行されなければならないことを忘れないでください。確認することで、間違ったスレッドにいることを自分で証明することができます。
NSThread.isMainThread() // is going to be false in the PF completion handler
付録
もし可能性があるなら
self
が nil になる可能性がある場合、例えば、不要になったので棄却されるとか、 他の方法で割り当てが解除されるとか、そのような場合は、self を
[weak self]
ではなく
unowned
で、安全なアンラップを使用します。
if let s = self { s.doStuff() }
またはオプションのチェーニングを使用します。
self?.doStuff(...)
付録2
これは人気のある答えのようなので、この新しい選択肢をここで紹介しておくことが重要です。
NSOperationQueue.mainQueue().addOperationWithBlock {
[weak self] in
self?.performSegueWithIdentifier("Test", sender: self)
}
注 https://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift :
NSOperation vs. Grand Central Dispatch (GCD)
GCD [dispatch_* calls] は、同時に実行される仕事の単位を表現する軽量な方法です。
NSOperationはGCDに比べ若干のオーバーヘッドを追加しますが、様々な操作の間に依存性を持たせ、再利用、キャンセル、中断を行うことができます。
補遺3
Appleはここでシングルスレッド・ルールを隠蔽しています。
<ブロッククオート注意
ほとんどの場合、UIKitのクラスはアプリのメインスレッドからのみ使用するようにしてください。 これは特に、UIResponderから派生したクラスや、UIKitに関連するクラスについて当てはまります。 アプリのユーザーインターフェイスを何らかの形で操作することになります。
SWIFT 4
DispatchQueue.main.async(){
self.performSegue(withIdentifier: "Test", sender: self)
}
参考
関連
-
[解決済み] Xcodeエラー "Could not find Developer Disk Image" が発生する。
-
[解決済み] Objective C - 値で渡す、参照で渡す
-
[解決済み] ナビゲーションアイテムのタイトルカラーを変更する方法
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] macOSアップデート後、Gitが動作しない(xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] Swiftベースのアプリケーションは、OS X 10.9/iOS 7以下でも動作しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Xcode コマンド /usr/bin/codesign は終了コード 1 で失敗しました : errSecInternalComponent
-
[解決済み] シミュレーターiOS 13でダークモードを使用するには?
-
[解決済み] Info.plist ユーティリティのエラーです。"そのようなファイルがないため、Info.plistを開くことができませんでした"
-
[解決済み] iOS Development 証明書が失効されました
-
[解決済み] ブリッジングヘッダ用のプリコンパイルヘッダの発行に失敗しました。
-
[解決済み] 脱獄したiphoneで`uicache`コマンドは何をするのですか?[クローズド]
-
[解決済み] アプリケーションは、アプリケーション起動の最後にルートビューコントローラーを持つことが期待される
-
[解決済み] BluetoothのロゴはiPhoneのキャラクターとして利用できますか?
-
[解決済み] iOS Swift 3 - UIDatePicker
-
[解決済み] Objective C - 値で渡す、参照で渡す