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

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

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

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

Q&A

解決済

2回答

2041閲覧

tableView余白(Cellがない部分)タップで特定の処理をしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

1クリップ

投稿2018/04/27 15:56

編集2018/04/27 19:12

お世話になります。
cellをタップすると、タップされたcellが存在するTableViewを編集対象にするという処理をしているのですが、
tableViewのcellが存在しない余白部分をタップした際に、同じような挙動を得る為に良い方法はないでしょうか?

tableViewのカスタムクラスを作成して、tableViewにタグを付け、touchesBeganをオーバーライドする方向で勧めてみたのですが、
カスタムクラス内からViewControllerのプロパティへのアクセス、メソッドを動かすところで詰まっています。
カスタムクラス内からviewControllerのプロパティ書き換え、メソッドを呼び出すにはどうすればよいでしょうか?

tapRecognizerは他の処理に使用しているので避けたいのですが、tapRecognizerを絡めないと無理でしょうか?

イメージ説明

swift

1class CustomTableView: UITableView { 2 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 3 super.touchesBegan(touches, with: event) 4 for touch: UITouch in touches { 5 let tag = touch.view!.tag 6 //let sender = touch.view! 7 switch tag { 8 case 3: 9 let vc = ViewController() 10         // vc = nilなので記述方法が間違っている 11         // 新規にVCを生成してるだけ? 12 print("vc.targetTableView:",vc.targetTableView) 13 vc.targetTableView = true 14 print("vc.targetTableView:",vc.targetTableView) 15 case 4: 16 let vc = ViewController() 17 print("vc.targetTableView:",vc.targetTableView) 18 vc.targetTableView = false 19 print("vc.targetTableView:",vc.targetTableView) 20 default: break 21 } 22 } 23 } 24} 25 26 27

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var jpWordChainTableView: UITableView! 6 @IBOutlet weak var enWordChainTableView: UITableView! 7 8 var targetTableView: Bool = true 9 10 let jpWordChainItems = ["きつね","ねずみ","みみずく","くま","まんもす"] 11 let enWordChainItems = ["bird","dog","giraffe","elephant","Tiger"] 12 13 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 14 if tableView == jpWordChainTableView { 15 return jpWordChainItems.count 16 } else { 17 return enWordChainItems.count 18 } 19 } 20 21 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 22 if tableView == jpWordChainTableView { 23 let cell = tableView.dequeueReusableCell(withIdentifier: "JpWordChainCell", for: indexPath) 24 cell.textLabel?.text = jpWordChainItems[indexPath.row] 25 return cell 26 } else { 27 let cell = tableView.dequeueReusableCell(withIdentifier: "EnWordChainCell", for: indexPath) 28 cell.textLabel?.text = enWordChainItems[indexPath.row] 29 return cell 30 } 31 } 32 // tableViewへの視覚効果変更 33 func changeTableViewAppearance(active: UITableView, deactive: UITableView) { 34 // セルの選択状態を解除する 35 if let indexPathForSelectedRow = deactive.indexPathForSelectedRow { 36 deactive.deselectRow(at: indexPathForSelectedRow, animated: true) 37 } 38 // セルの透明度を変更する 39 UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseIn], animations: {deactive.alpha = 0.4}, completion: nil) 40 UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseIn], animations: {active.alpha = 1.0 }, completion: nil) 41 } 42 43 // cellがタップされた場合にtargetTableViewの値を書き換える 44 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 45 if tableView == jpWordChainTableView { 46 targetTableView = true 47 changeTableViewAppearance(active: jpWordChainTableView, deactive: enWordChainTableView) 48 } else { 49 targetTableView = false 50 changeTableViewAppearance(active: enWordChainTableView, deactive: jpWordChainTableView) 51 } 52 } 53 54 override func viewDidLoad() { 55 super.viewDidLoad() 56 // Do any additional setup after loading the view, typically from a nib. 57 changeTableViewAppearance(active: jpWordChainTableView, deactive: enWordChainTableView) 58 } 59 60 override func didReceiveMemoryWarning() { 61 super.didReceiveMemoryWarning() 62 // Dispose of any resources that can be recreated. 63 } 64}

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

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

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

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

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

guest

回答2

0

ベストアンサー

自らの力量不足を呪いつつ。
NotificationでカスタムクラスからviewControllerに処理を丸投げしました。

swift

1import UIKit 2class CustomTableView: UITableView { 3 4 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 5 super.touchesBegan(touches, with: event) 6 for touch: UITouch in touches { 7 let tag = touch.view!.tag 8 switch tag { 9 case 3: 10 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "jpWordChainTableViewTapped"), object: nil) 11 case 4: 12 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "enWordChainTableViewTapped"), object: nil) 13 default: break 14 15 } 16 } 17 } 18}

投稿2018/04/28 15:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

おっしゃられているように

let vc = ViewController()

だと新しいViewControllerを作成しているだけになるかと思いますので、CustomTableViewにViewControllerを参照する変数を持つ必要があります。(循環参照に注意が必要です。)

また、storyboardを使用されている場合、ViewControllerは下記のようにすれば取得できると思います。

// Main.storyboardを使用しているとします。 let storyboard = UIStoryboard(name: "Main", bundle: nil) // ViewControllerという名前でStoryboardIDを設定しているとします。 let vc = storyboard.instantiateViewController(withIdentifier: "ViewController")

投稿2018/04/27 22:13

newmt

総合スコア1277

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

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

退会済みユーザー

退会済みユーザー

2018/04/28 04:46 編集

回答ありがとうございます。 viewControllerは、遷移しているわけではなく、ずっと存在しているので、この場合インスタンス化しても仕方がないのか?と思い、いろいろやってみたのですが。 とりあえず、viewControllerのプロパティtargetTableViewには、宣言をstatic var targetTableViewと することでカスタムクラスから値の書き換えができるようになりました。 viewControllerのメソッドをカスタムクラスから呼び出すと、viewControllerにoutlet接続されている tableViewに変更を加えるところでランタイムエラーになってしまって困っています。 たとえば、 func printYes(){ print("YES") } などは、カスタムクラスから、viewController().printYes()と呼び出せるのですが、 func changeTableViewAlpha(){ UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseIn], animations: {self.jpWordChainTableView.alpha = 0.4}, completion: nil) } などは、カスタムクラスから、viewController().changeTableViewAlpha()と呼び出すと jpWordChainTableViewが予期せぬnilでランタイムエラーになってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問