質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

475閲覧

文字入力フォームライブラリ「Eureka」のTextRowでの入力値について

po_tato

総合スコア97

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

5クリップ

投稿2017/07/18 10:26

編集2017/07/19 01:17

Eurekaで入力フォームを作成しているのですが、
TextRowで文字を入力する際に、最初に入力した値がもう一度入力されてしまう現象が起きています。詳しく説明すると、「あいうえお」と打とうとすると「ああいうえお」となってしまうということです。
何か改善策を知っている方がいればご意見お聞かせください。

ソースコードは下記となります。


import UIKit
import Eureka

class ViewController: FormViewController{

let userDefault = UserDefaults.standard override func viewWillAppear(_ animated: Bool) { if (userDefault.object(forKey: "Name") != nil){ print("データあり:\(userDefault.value(forKey: "Name"))") }else{ print("データなし") } } override func viewDidLoad() { super.viewDidLoad() form +++ Section("名前、性別") <<< TextRow("Name"){ $0.title = "名前" $0.placeholder = "ここに書いてね" if let Name:String = self.userDefault.object(forKey: "Name") as! String?{ $0.value = Name } $0.add(rule: RuleRequired()) $0.validationOptions = .validatesOnChange }.cellUpdate{ cell,row in if !row.isValid{ cell.titleLabel?.textColor = .red cell.textField.placeholder = "値を入力してください" } }.cellSetup { cell, row in cell.tintColor = .white } .onChange{row in self.userDefault.set(row.value, forKey: "Name") } func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

}


一文字目タップした時点
イメージ説明
2文字目タップ時点
イメージ説明

kanemotos👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykws

2017/07/18 13:23

ソースコードの部分は ``` で括ると読みやすくなります。
ykws

2017/07/18 13:31

「あいうえお」と打とうとすると「ああいうえお」となってしまうということです、という部分がわかりにくく、「あいうえお」と入力して確定すると、セルには「ああいうえお」と表示されるということですか?
po_tato

2017/07/19 01:13

コメントありがとうございます!もう少し詳しく説明すると、「あ」という文字を1回タップした状態では入力欄にはその通り出ているのですが、Doneを押したり、2文字目以降をタップすると(例:「あい」など...この場合「ああい」と入力される)そのような現象が起きます。何か単語を入れようとすると、その単語+単語の1文字目が勝手に頭部分に付加されるのです。分かっていることは単語全てを入力し確定してから付加されるのではなく、2文字目を入力すると付加されます。写真も追加しております。
guest

回答2

0

ベストアンサー

私も同じ現象で困っている者です。。。。

とりあえず、原因となる箇所がわかりましたので共有いたします。
※ごめんなさい、解決には至っていないです。

Pods/Eureka/Row.swift
class : RowOf<T: Equatable>: BaseRow

swift

1 /// The typed value of this row. 2 open var value: T? { 3 set (newValue) { 4 _value = newValue 5 guard let _ = section?.form else { return } 6 wasChanged = true 7 if validationOptions.contains(.validatesOnChange) || (wasBlurred && validationOptions.contains(.validatesOnChangeAfterBlurred)) || !isValid { 8 validate() 9 } 10 } 11 get { 12 return _value 13 } 14 }

Cellに対し値を入力すると、下記の条件で validate() が実行してしまっているようです。

『"validationOptions"の".validatesOnChange"』 または
『"wasBlurred"がtrue 且つ .validatesOnChangeAfterBlurred』 または
『!isValid』

[考えられる回避方法]
下記の二つの対策をすればいいと思いますが、、validate()を走らせないのはどうすればいいのやら・・・・。

・validationOptionsを「.validatesOnChange」 および「.validatesOnChangeAfterBlurred」以外に設定する
・入力エラー時に validate() 処理を走らせないようにする

■追記情報

Eurekaのgithubを確認すると、原因となる対象のソースファイルが18日前に更新されておりました!
これで、この問題を解決できるのではないでしょうか?

[回避方法]
・Eurekaを更新する
または
・原因の箇所のみ更新(非推奨)

Pods/Eureka/Row.swift
class : RowOf<T: Equatable>: BaseRow
※githubより引用

swift

1 /// The typed value of this row. 2 open var value: T? { 3 set (newValue) { 4 _value = newValue 5 guard let _ = section?.form else { return } 6 wasChanged = true 7 if validationOptions.contains(.validatesOnChange) || (wasBlurred && validationOptions.contains(.validatesOnChangeAfterBlurred)) || (!isValid && validationOptions != .validatesOnDemand) { 8 validate() 9 } 10 } 11 get { 12 return _value 13 } 14 }

validate() を実行する制御文で下記の条件に変更されてました!

『(!isValid && validationOptions != .validatesOnDemand)』

その為、validationOptionsを".validatesOnDemand"とすれば
初回のテキスト入力時にvalidationが走らなくなると思います。
※入力項目にエラーとなっていた場合にも同様です。

投稿2017/08/07 06:19

編集2017/08/09 02:50
YoritoFukushima

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

po_tato

2017/08/07 10:09

まさか同じところで悩んでいる方がいるとは思いませんでした。 他の方も記載していますが、やはりvalidateが原因なのですかね? 一度validateもonChange等も外して見ましたけど、それでも変わらなかったんですよね(泣)私もこれから解決方法を探っていくので解決できるように頑張りましょう。情報ありがとうございました!
po_tato

2017/08/10 03:16

これは本当に有益な情報をありがとうございます! 早速実装して確認してみましたが、完璧でした! $0.validationOptions = .validatesOnDemand このように変えるだけで良かったので簡単でした。 これのせいでEurekaを嫌いになる一歩手前でしたが、良かったです。 本当にありがとうございます! それとフォローさせていただきます。
kanemotos

2017/08/10 08:25

横から失礼します。私もほぼ同じ現象で悩んでいました。 (私の場合は、一度validateを実行してエラーになった後に、TextRowにフォーカスを当てると発生するという条件でした。) 海外ライブラリで、英語では発生しなさそうな現象なので、解決されないかなーと思って、半ば諦めておりました。けどまさかのアップデートで解決しているなんて!! 情報ありがとうございます。早速ライブラリのバージョンアップして、現象が起きなくなったことを確認しました!!!
po_tato

2017/08/10 10:32

やはり同じように悩んでいた方が他にいましたか。逆にこれがググって出なかったことにびっくりです。でも解決して本当に良かったです。Yoritoさんにただただ感謝です。
guest

0

変換の確定待ちの状態にならないように、半角英数を入力しても同じことがおきますか?

onChangeとcellUpdateを外しても同じことが起きますか?

投稿2017/08/01 17:27

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

po_tato

2017/08/04 07:55 編集

半角英数字はそのような現象が起こりませんでした!ひらがななどの確定待ちの場合だけ起こるようです! ただonChangeとcellUpdateを外しても変わらずでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問