20220402のSwiftに関する記事は3件です。

【非同期処理】UITableViewが`Index out of range`でクラッシュする回避策

環境 ・Swift 5.5.2 ・Xcode 13.2.1 発生したエラー ※一部コードを省略しています ViewController.Swift override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.users = [] db.fetchUsers { [weak self] result in guard let self = self else { return } switch result { case .success(let users): self.users = users case .failure(let error): print(error.localizeddescription) } } } extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! UITableViewCell cell.configure(user: users[indexPath.row]) //この行で`index out of range`が発生する return cell } } extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("indexpath.row: \(users[indexPath.row])") //タップした時にこの行で`index out of range`が発生する } } 原因 非同期でデータを受け取る前(配列がまだ空)にcellForRowAtやdidSelectRowAtが呼ばれて、存在しない要素にアクセスしたため。 回避策 下記のように、配列が空の時は早期リターンでアクセスしないようにすることで回避できます。 ViewController.Swift func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! UITableViewCell guard users.count > 0 else { return cell } //このコードを追加 cell.configure(user: users[indexPath.row]) return cell }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】画面遷移をした後にキーボードを自動的に表示させる方法

はじめに キーボードを起動するためにテキストフィールドを毎回タップするのがめんどくさいなぁと感じたため、画面が開いたときにキーボードが自動的に表示される方が便利と思いました。そのため、画面遷移をした後にキーボードを自動的に表示させる方法を書いていきます。 やり方 これを実現するには簡単で、新しいメソッドをViewController内に以下のコードを追加します。 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) textField.becomeFirstResponder() } 詳細説明 override func viewWillAppear(_ animated: Bool) {とは? 画面に表示される直前に呼ばれるメソッドです。初期表示に必要なviewDidLoad()とは異なり、毎回呼び出されます。 UIViewControllerのライフサイクルについての詳細は以下の記事をご参照ください textField.becomeFirstResponder() UITextFieldはファーストレスポンダにすることによりキーボードを表示することができます。逆にファーストレスポンダをやめるとキーボードを非表示にすることができます。 そのため、textField.becomeFirstResponder()とすることにより、画面を読み込むたびにキーボードを表示することができます。 「ファーストレスポンダ」とは? iOSでは「レスポンダチェーン」と呼ばれる仕組みが用意されています。一連のレスポンダオブジェクトの連なりで、イベントを処理できるオブジェクトを決定するために使用されます。 レスポンダオブジェクトは基本的にView階層のかいに位置されるオブジェクトから順に評価されるため、最初にイベントを受け取るレスポンダオブジェクトを「ファーストレスポンダ」と呼びます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】画面遷移時にキーボードを表示させる方法

はじめに キーボードを起動するためにテキストフィールドを毎回タップするのがめんどくさいなぁと感じたため、画面が開いたときにキーボードが自動的に表示される方が便利と思いました。そのため、画面遷移をした後にキーボードを自動的に表示させる方法を書いていきます。 また、これは画面遷移が完全に終わる前にキーボードを事前に表示しておく方法です。画面遷移が完全に終了した後の処理はこの後出てくるviewWillAppearをviewDidAppearにすると可能です。 やり方 これを実現するには簡単で、新しいメソッドをViewController内に以下のコードを追加します。 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) textField.becomeFirstResponder() } 詳細説明 override func viewWillAppear(_ animated: Bool) {とは? 画面に表示される直前に呼ばれるメソッドです。初期表示に必要なviewDidLoad()とは異なり、毎回呼び出されます。 UIViewControllerのライフサイクルについての詳細は以下の記事をご参照ください textField.becomeFirstResponder() UITextFieldはファーストレスポンダにすることによりキーボードを表示することができます。逆にファーストレスポンダをやめるとキーボードを非表示にすることができます。 そのため、textField.becomeFirstResponder()とすることにより、画面を読み込むたびにキーボードを表示することができます。 「ファーストレスポンダ」とは? iOSでは「レスポンダチェーン」と呼ばれる仕組みが用意されています。一連のレスポンダオブジェクトの連なりで、イベントを処理できるオブジェクトを決定するために使用されます。 レスポンダオブジェクトは基本的にView階層のかいに位置されるオブジェクトから順に評価されるため、最初にイベントを受け取るレスポンダオブジェクトを「ファーストレスポンダ」と呼びます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む