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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

4回答

2592閲覧

Swift iPhone 5でセルをタップしてもアクションシートが表示されない

eizi

総合スコア13

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/03/23 06:45

編集2016/03/28 13:59

下記のようにテーブルを表示させて、セル2をタップしたらアクションシートを表示させることをやっているのですが、iPhone5で検証するとセルタップの挙動が不信で行き詰まっています。

イメージ説明

下記の手順で動作をチェックすると、アクションシートがうまく表示される場合もありますが、
セル1タップ → セル2タップ

何回か繰り返していると、こんな挙動に見舞われます
セル1タップ → セル2タップ → アクションシートが表示されず、セル外かセル2をもう一度タップで表示

直接セル2を2回タップしてやっと表示される場合もあります。

iPhone 5のiOSは、9.2.1です。
シミュレーター、及びiPhone 6sのiOS 9.2.1の環境でも同様に確認したのですが、こちらは問題ありませんでした。

実装ではカスタムセルを使っています。
Xcode 7.2.1
Swift 2.1

Swift

1//ViewController.swift 2 3import UIKit 4 5class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 } 11 12 // セクション数 13 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 14 return 1 15 } 16 17 // 行数 18 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 19 return 2 20 } 21 22 // 表示 23 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 24 // カスタムセル 25 let cell = tableView.dequeueReusableCellWithIdentifier("tableCell") as! TableCell 26 27 if indexPath.section == 0 { 28 if indexPath.row == 0 { 29 cell.textLabel?.text = "セル1" 30 } else if indexPath.row == 1 { 31 cell.textLabel?.text = "セル2" 32 } 33 } 34 35 return cell 36 } 37 38 // セルがタップされた時の処理 39 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 40 if indexPath.section == 0 { 41 if indexPath.row == 0 { 42 print("セル1") 43 } else if indexPath.row == 1 { 44 showActionSheet() 45 print("セル2") 46 } 47 } 48 } 49 50 func showActionSheet() { 51 let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) 52 actionSheet.addAction( 53 UIAlertAction(title: "項目1", style: UIAlertActionStyle.Default, handler: {(action) -> Void in 54 }) 55 ) 56 actionSheet.addAction( 57 UIAlertAction(title: "項目2", style: UIAlertActionStyle.Default, handler: {(action) -> Void in 58 }) 59 ) 60 let cancelAction = 61 UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.Cancel, handler: nil) 62 63 actionSheet.addAction(cancelAction) 64 65 self.presentViewController(actionSheet, animated: true, completion: nil) 66 } 67 68 override func didReceiveMemoryWarning() { 69 super.didReceiveMemoryWarning() 70 } 71}

Swift

1// TableCell.swift 2import UIKit 3 4class TableCell: UITableViewCell { 5 6}

自分が持っているiPhone 5の不具合なのかなと考えてしまいますが、何かご存知の方、アドバイスを頂けたらです。
よろしくお願いいたします。

[追記 2016.3.24]
動画でみるとどんな挙動か分かりやすいです。
https://twitter.com/Ojehul/status/712843876868829184

現在、分かっていることは、Storyboard上でTable View CellのSelectionをNoneの設定をしているか、コード上で下記の設定を行うとこの現象が起きるようです。
cell.selectionStyle = UITableViewCellSelectionStyle.None

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

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

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

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

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

fuzzball

2016/03/23 08:56

セル2がグレーで選択状態になるのにアクションシートが表示されないのでしょうか? それとも、そもそも選択状態にならないのでしょうか?
eizi

2016/03/23 09:41

返信ありがとうございます。 セル2が選択状態になるのにアクションシートが表示されないですね。 ただ、返信いただいた「グレーの選択状態」というのを見て、Storyboard上でTable View CellのSelectionをNoneにしていたのを思い出して、Defaultにしたら表示されるようになりました。 セルをタップしてもセルの背景をグレーではなく白のままにしたかったのでSelectionをNoneにしたのですが、コード上で制御しないとダメっぽいですね。 コード上でのアプローチをしてみたいと思います。 ありがとうございました!!
guest

回答4

0

ベストアンサー

iPhone5の実機は持っていませんが、fuzzballさんのコメントでシミュレータでも発生するとのことでしたので、私もやってみました。
すると、確かにTable View CellのSelectionをNoneの設定をしているとこの現象が起きます。さらに、元の質問ではiPhone6sでは問題ないとのことでしたが、私の環境ではiPhone6sのシミュレータでも実機でも同じように問題発生しました。

さらにわかったことは、Table View CellのSelectionをDefaultにしていても、
セル2タップ → アクションシート表示 → セル外タップ → アクションシート消去 → 再度セル2タップ
とすると、やはりアクションシートが表示されない(fuzzballさんがコメントされている通り、実際にはアクションシートが数十秒遅れて表示される)現象が発生しました。

原因ははっきりと説明できませんが、おそらくdidSelectRowAtIndexPathのタイミングでアクションシートを表示すると、動作が不安定になるのだと思います。
(didSelectRowAtIndexPathだけでなく、タッチイベント呼び出しの延長でGUI処理をいろいろやると、不安定になる場合があることを経験しています。)

そこで、self.showActionSheet()の呼び出し処理を

swift

1dispatch_async(dispatch_get_main_queue(), { () -> Void in 2 self.showActionSheet() 3})

とし、一旦メインキューに回してからアクションシートを開いてみてください。
これで安定すると思います。私の環境では、これで問題なく動作するようになりました。

投稿2016/03/24 08:14

TakeOne

総合スコア6299

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

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

eizi

2016/03/24 08:48

安定して開くようになりました、ありがとうございます! パッと見、アクションシートを表示させるだけのそれほどの処理はしてないように思えたんですが、TakeOneさんのコメントからしてアクションシートそのものに問題がありそうに見受けられますので、少し使いドコロや代替案を考えてみたいと思います。 本当に助かりましたありがとうございます!
fuzzball

2016/03/24 08:56

念のためメインスレッドかどうかまでは調べていたのですが、どうせならdispatch_asyncまで試してみれば良かったです。(ちょっと悔しいw)
guest

0

動画見ました。不思議な動きしてますね。
なんだか色々問題がありそうですが、

swift

1// セルがタップされた時の処理 2 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 3 tableView.deselectRowAtIndexPath(indexPath, animated: true) 4 if indexPath.section == 0 { 5 if indexPath.row == 0 { 6 } else if indexPath.row == 1 { 7 showActionSheet() 8 } 9 } 10 }

ではどうでしょうか?

投稿2016/03/24 04:05

Rumi_Igarashi

総合スコア47

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

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

eizi

2016/03/24 04:23

ありがとうございます 試してみましたが、やはりダメでした iOSのバージョンは同じなのに、機種で挙動が異なるものですね。。。
Rumi_Igarashi

2016/03/24 04:25

そうでしたか。。 お力になれずすみませんでした…
eizi

2016/03/24 05:27

いえ、こちらこそ基調なお時間をありがとうございます
guest

0

ちょっと思ったのですが、Selection=Noneの状態で、セルをタップ出来たかどうかはどうやって判断したのでしょうか?
そもそもタップ出来ていないだけのような気もするので、以下のことを試してみて下さい。

・アクションシートが閉じきる前にタップしたときに「タップ出来ない」と思っているだけではないのか?
→ タップする間隔を長めにして確実にタップしてみる。

・iPhone5だと画面が小さいので正しくタップ出来ていないのではないか?
(画面の大きいiPhone6sや、マウスを使うシミュレータだと正確にタップ出来ているのではないか?)
→ セルの高さを高くしてみて試してみる。

投稿2016/03/24 00:25

fuzzball

総合スコア16731

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

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

eizi

2016/03/24 04:02 編集

すみません、投稿時には入れてなかったですが、セルのタップはprint文で確認しました。 // セルがタップされた時の処理 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { if indexPath.section == 0 { if indexPath.row == 0 { print("セル1") } else if indexPath.row == 1 { showActionSheet() print("セル2") } } } 実際に動画を撮ってみましたので、見てもらうと分かりやすいかと思います。 https://twitter.com/Ojehul/status/712843876868829184 一回目は問題なくアクションシートを表示できてますが、やはり二回目で表示されなくて、セル外の部分をタップするとアクションシートが表示されてしまいます。 セルの高さも100と大きくしてあります。 個別のセル内でこんな風にコードで制御すればいけるかなと思ったのですが、やはり同様の現象が出ててまだ頭を抱えてる状態です。 cell.selectionStyle = UITableViewCellSelectionStyle.None よろしくお願いします。
fuzzball

2016/03/24 04:17 編集

ちょっと追試して気付いたのですが、アクションシートが開かないのではなく、開くまでに時間が掛かるだけのようです。1分ほどして開いたことがありました。
fuzzball

2016/03/24 05:17

うーん、セルがSelection=Defaultでもなるし、シミュレータでもなるし、機種とかOSは関係ないような気がしてきました。 ・iPhone5 + iOS8.4.1(実機) ・iPhone5 + iOS9.2(シミュ) ・iPhone6s Plus + iOS9.2(シミュ)
eizi

2016/03/24 08:37

なるほど、遅延してたんですね TakeOneさんのこのコードで安定して開くようになりました!! ```Swift dispatch_async(dispatch_get_main_queue(), { () -> Void in self.showActionSheet() }) ``` ありがとうございます!!
guest

0

Storyboard上でTable View CellのSelectionをNoneにしていると、iPhone 5ではこの現象が起きるようで、Defaultに戻したら解決しました。

投稿2016/03/23 09:45

eizi

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問