質問編集履歴

1 追記

退会済みユーザー

退会済みユーザー

2018/05/23 20:07  投稿

Gesture等のダブルクリックや長押しした際の処理について
```swift
struct Cell {  
 var detail: [String]  
 var lightswipe: Bool//detail  
 var tag: Int  
}  
 
import UIKit
class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate{
 
 @IBOutlet weak var mytableView: UITableView!
 
 //構造体
 var titles: [String] = [] // title用
 var products: [Cell] = []//detail
   
   
 class namelabel {  
   var labels: [UILabel] = []  
 }  
 
 
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   // 全データの合計
   return titles.count + products.count
 }
 
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = UITableViewCell()
   let index = Int(floor(Double(indexPath.row / 2)))
   //セルタップ時のハイライトについて
   cell.selectionStyle = .none
     
   // title行
   if indexPath.row % 2 == 0 {
       
     //ここ再確認  
     //破線について  
     let path = UIBezierPath()  
     path.setLineDash([6.0, 2.0], count: 2, phase: 0.0)  
     
     guard titles.count > 0 else {
       return cell
     }
     
     
     let title = titles[index]
     cell.textLabel?.text = title
     //センター寄せ
     cell.textLabel!.textAlignment = NSTextAlignment.center
     cell.backgroundColor = UIColor(red: 0.0, green: 0.8, blue: 1.0, alpha: 0.3)
     
   // detail行
   } else {
     cell.backgroundColor = UIColor.lightGray
     let item = products[index]
     
     guard item.detail.count > 0 else {
       return cell
     }
     
     var labels: [UILabel] = []
   
     let hoge = namelabel()
     //labelについて
     for i in item.detail {
       let label = UILabel()
       label.backgroundColor = UIColor(red: 0.0, green: 0.8, blue: 0.9, alpha: 0.2)
       label.text = i
       
       
       // textLabel という名前の変数に格納された UILabel にフォントサイズの自動調整を設定します。
       label.adjustsFontSizeToFitWidth = true
       label.minimumScaleFactor = 10.0
       //丸みに対して
       label.layer.cornerRadius = 5
       label.layer.masksToBounds = true
       cell.contentView.addSubview(label)
       labels.append(label)
       hoge.labels.append(label)
     }
     
     var preLabel: UILabel? = nil
     for l in labels {
     for l in hoge.labels {
       
       l.translatesAutoresizingMaskIntoConstraints = false
       if (preLabel == nil) {
         l.leftAnchor.constraint(equalTo: cell.contentView.leftAnchor, constant: 12).isActive = true
       } else {
         l.leftAnchor.constraint(equalTo: preLabel!.rightAnchor, constant: 20).isActive = true
       }
       cell.contentView.heightAnchor.constraint(equalTo: l.heightAnchor, multiplier: 1).isActive = true
       preLabel = l
     }
     
   }
   
   return cell
 }
```
**困っている箇所**
```swift
func deletealert() {
   let hoge = namelabel()  
   let alert = UIAlertController(title:"you realy want to delete?", message: "メッセージ", preferredStyle: .alert)
   
   let okAction = UIAlertAction(title: "YES", style: .default, handler: {
     (action:UIAlertAction!) -> Void in
     
     //labelの削除について
     self.products[0].tag = 1
     hoge.labels.tag = 1
     
     self.view.subviews.forEach {
       if $0.tag == 1{
         $0.removeFromSuperview()
         
       }
     }
   })
   alert.addAction(okAction)
   
   // キャンセルボタンの設定
   let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
   alert.addAction(cancelAction)
   
   alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生
   // アラートを画面に表示
   self.present(alert, animated: true, completion: nil)
   
 }
 
 //長押しやダブルクリックについて
 @objc func longpress(sender: UILongPressGestureRecognizer){
   
   let hoge = namelabel()
   // 長押し開始〜
   if(sender.state == UIGestureRecognizerState.began)
   {
     
   } else if (sender.state == UIGestureRecognizerState.ended)
   {
     //labelの削除について
     products[0].detail[0] = ""
     self.products[0].tag = 1
     hoge.labels.tag = 1
     
     self.view.subviews.forEach {
       if $0.tag == 1{
         $0.removeFromSuperview()
         
       }
     }
     //alert()
     print("ロングタップされたよ。")
   }
   
 }
 
 @objc func doubletap(sender: UITapGestureRecognizer){  
   if(sender.state == UIGestureRecognizerState.began)  
   {  
   }else if(sender.state == UIGestureRecognizerState.ended)  
   {  
     deletealert()  
     print("tapされたよ")  
   }  
     
 }  
   
 func Gesture() {
   
    let hoge = namelabel()  
   // UILongPressGestureRecognizerインスタンス作成
   let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longpress(sender:)))
   
   // 時間(デフォルト0.5秒)
   longPressGesture.minimumPressDuration = 0.5
   products.isUserInteractionEnabled = true
   products.addGestureRecognizer(longPressGesture)
   hoge.labels[0].isUserInteractionEnabled = true
   hoge.labels[0].addGestureRecognizer(longPressGesture)
   
   
   
 }
 
 func doubleclic(){
   let hoge = namelabel()  
   // ダブルタップ
   let doubeltapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.doubletap(sender:)))
   doubeltapGesture.numberOfTapsRequired = 2
   products.isUserInteractionEnabled = true
   products.addGestureRecognizer(doubeltapGesture)
 }
 
 @objc func doubletap(sender: UITapGestureRecognizer){
   if(sender.state == UIGestureRecognizerState.began)
   {
   }else if(sender.state == UIGestureRecognizerState.ended)
   {
     deletealert()
   }
   
   hoge.labels[0].isUserInteractionEnabled = true
   hoge.labels[0].addGestureRecognizer(doubeltapGesture)
 }
```
### 実現したい事・困っている事
products.isUserInteractionEnabled = true
products.addGestureRecognizer(doubeltapGesture)
Value of type '[Cell]' has no member 'isUserInteractionEnabled'
Value of type '[Cell]' has no member 'addGestureRecognizer'
上記のコードでこの様なエラーが出てしまいました。実現したい事としてはセルの中のラベルをダブルタップや長押しをできる様にしたいです。
しかし、コーディングの際にcellForRowAT内にラベルのインスタンスを作ったのでどう結びつければいいのか分からなくて困っています。
しかし、コーディングの際にcellForRowAT内にラベルのインスタンスを作ったのでどう結びつければいいのか分からなくて困っています。
**現在困っている事**
classを作ることにより上記のエラーは取れましたがそれに伴い、以下の場所でエラーが出来ました。
エラーの意味は理解できるのですがその対処法が分からなくて困っています。
```
hoge.labels.tag = 1 //Value of type '[UILabel]' has no member 'tag'
```
  • iOS

    5076 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    5460 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    9711 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る