iOS Swift

[Swift]UITableViewCellにUIButtonを直接addSubviewしてはいけない

ベル打ちキーボードを改良しているときどハマりしてしまいました。

ベル打ちキーボードはこちらからダウンロードできます。

The app was not found in the store. 🙁

なぜか反応するUIButtonと反応しないUIButtonがある

入力した文字を漢字変換する際に、変換候補をUITableViewとUITableViewCellを使って一覧化する改造を行っていました。

こんな感じです。(開発中だったので色がついています。)

各行がUITableViewCellで、その中に四角くなっているのがUIButtonです。変換候補をタップすると、漢字変換が確定します。

それで動作確認をしていたのですが、なぜか、単語をタップしても反応しないものと、タップすると反応するボタンが存在していました。

この図だとこんな感じでした。

  • 1行目のボタンは全て反応する。
  • 2行目以降は、一番左のボタンだけ反応しない。二個目以降は反応する。

という全く謎の挙動を示しました。

UIButtonが枠からはみ出ていたら反応しない、とか、親ViewのUser Interaction Enabledがfalseだと反応しないとか色々な記事を検索して試しましたが、どれも動きませんでした。。。。

原因が判明した→直接UITableViewCellにaddSubviewしたのが間違い

半日ぐらいうんうんうなっていたところ原因が判明しました。

変換候補のボタンをUITableViewCellに貼り付ける際に

var row = UITableViewCell()
row.addSubview(button)

と、UITableViewCellに直接addSubviewしていたのですが、これが間違いでした。UITableViewCellにボタンを貼り付ける場合は、

var row = UITableViewCell()
row.contentView.addSubview(button)

と、UITableViewCellのcontentViewに対してaddSubviewしなければ反応しないようでした。

これで問題解決しました。

それにしても、間違った操作をしたら全く動作しないのならわかりやすいのですが、中途半端に変な法則性を持っておかしな動きをするのでSwiftはデバッグが難しいですね。。。

 

-iOS, Swift

© 2022 かずのアプリときどきキャンプ飯 Powered by AFFINGER5