TableViewCell上に配置したTextfieldの値がずれて表示される
Tableview上にcellが約60あり、全てのcellにtextfieldが1つずつ配置されています。cellの数は設定によって変わり、高さもまちまちです。
複数のtextfieldに入力された値を一括で保存するのですが、保存後に前の画面に戻り再度同じ画面を開くと後半のcell(50セル目の辺りから)の値がずれて表示される、という不具合がユーザーから報告されました。
入力を以下のようにしたら、
項目A:「1」
項目B:「2」
項目C:「3」
項目D:「4」
再表示すると以下のようになるようです。
項目A:「1」
項目B:「3」
項目C:「4」
項目D:「」(空になる)
情報が限られている為自身の環境では再現できず、原因箇所は断定できないのですが、「ずれる」という現象から、cellからTableViewControllerへ入力値の変更を通知している箇所が怪しいのではないかと考えています。(前の画面に表示されるデータがずれた値になっていることから、保存時点で既にずれていると推測)
以下がそのコードですが、「_arr」配列変数をデータのI/Oで使用しており、textfieldの値が書き換えられたら、この配列の該当インデックスにセットし直しています。
class MyCell: UITableViewCell, UITextFieldDelegate {
func textFieldDidEndEditing(textField: UITextField) {
if _strTxtBfr != textField.text { //変更されたかチェック
UIApplication.sharedApplication().sendAction(#selector(MyTableController.cell_Change(_:)), to: nil, from: self, forEvent: nil)
}
}
func dispVal(dic: [String: String]) {
lblKey.text = dic["key"]
lblTitle.text = dic["title"]
txtVal.text = dic["val"]
}
func getVal() -> (key: String, val: String) {
return (lblKey.text!, txtVal.text!)
}
}
class MyTableController: UITableViewController {
override func cell_Change(sender: MyCell) {
if let indexPath = self.tableView.getIndexPath(sender) {
let (_, val) = sender.getVal() //入力値を取得
_arr[indexPath.section][indexPath.row]["VAL"] = val //入力値を変数にセット
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let data = _arr[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCellWithIdentifier("cellTxt", forIndexPath: indexPath) as! MyCell
cell.dispVal([
"key": data["CD"]!,
"title": data["NAME"]!,
"val": data["VAL"]!,
])
return cell
}
}
extension UITableView {
/// cellのNSIndexPathを取得する
func getIndexPath(sender: UIView?) -> NSIndexPath? {
if let obj = sender {
let point = self.convertPoint(obj.frame.origin, fromView: obj.superview)
if let indexPath = self.indexPathForRowAtPoint(point) {
return indexPath
} else {
print("tableView.indexPathForRowAtPointがnil")
}
} else {
print("senderがnil")
}
return nil
}
}
DBのテーブルのキーとなるCDとその値が対になって保持されているべきですが、この箇所だけはCDではなくindexPathで値の書き換えを行なっています。
indexPathForRowAtPointが正しくない場合この不具合の説明がつきそうなのですが、そんなことは起こりえるでしょうか??
セルの数や高さが固定でないこと、セルの後半の50セル目辺りからずれていることから、indexPathForRowAtPointのバグかな?と推測したのですがどうでしょうか?
不具合の出ている端末はおそらくiphone6か6sです。
あるいはindexPathForRowAtPointではなく他の箇所に問題があるでしょうか?コードがおかしいようでしたらご指摘ください。
よろしくお願いいたします。