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

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

ただいまの
回答率

90.99%

  • Swift

    6102questions

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

  • Xcode

    3518questions

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

  • iOS

    3474questions

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

  • iPhone

    870questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

  • TableView

    93questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

tableView 左から右にスワイプ

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 386

haruka-t

score 50

イメージ説明

出来たことと今のコード

import UIKit

class ViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {

  @IBOutlet weak var mytableView: UITableView!


   let initialItems: [String] = []

   var kei: [Item] = Array()



  override func viewDidLoad() {
    super.viewDidLoad()

    mytableView.delegate = self
    mytableView.dataSource = self

   for name in initialItems {
     kei.append(Item(name: name, deletable: false,deletecell: false, completable: false,cellcolor: false))
      kei.append(Item(name: name, deletable: false, deletecell: false, completable: false,cellcolor: false))
   }

  }



  @IBAction func addbtr(_ sender: Any) {


   let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)


      let okAction = UIAlertAction(title: "OK", style: .default, handler: {
         (action:UIAlertAction!) -> Void in


         if let textFields = alert.textFields {


            for textField in textFields {
               //self.items.append(Item(name: textField.text!))
              self.kei.append(Item(name: textField.text!,deletable: true, deletecell: true,completable: false, cellcolor: true)) 
            }
           self.kei.append(Item(name: textField.text!,deletable: true, deletecell: true,completable: false, cellcolor: true))
            self.mytableView.reloadData()

         }
      })
      alert.addAction(okAction)


      let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
      alert.addAction(cancelAction)


      alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in
         textField.placeholder = "テキスト"
      })


      alert.view.setNeedsLayout() 
      self.present(alert, animated: true, completion: nil)

   }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return kei.count
  }


   func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {

      switch indexPath.row {
      case 1:
         return indexPath;

      default:
         return nil;
      }
   }

   func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
      return indexPath
   }

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

      let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
      //追加した内容に対して
      let item = kei[indexPath.row]
      cell.textLabel?.text = item.name


      if cell.textLabel?.text != "cell 追加 ボタン" {
         cell.accessoryType = item.complete ? .checkmark : .none
         cell.textLabel?.textColor = UIColor.black
         cell.backgroundColor = UIColor.yellow
      }else {
         cell.accessoryType = .none
         cell.textLabel?.textColor = UIColor.red
         cell.backgroundColor = UIColor.black
      }

      if indexPath.row == 0 {
         cell.textLabel?.textColor = UIColor.black
         cell.backgroundColor = UIColor.white
         cell.accessoryType = .none
         }

      return cell
   }
   func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) -> IndexPath? {

      let cell = tableView.cellForRow(at: indexPath)

     if cell?.textLabel?.text != "cell 追加 ボタン"{
      kei[indexPath.row].toggle()
      tableView.deselectRow(at: indexPath, animated: true)
      tableView.reloadRows(at: [indexPath], with: .none)
      return nil
     }else {
      let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)


    let okAction = UIAlertAction(title: "OK", style: .default, handler: {
      (action:UIAlertAction!) -> Void in

      if let textFields = alert.textFields {


        for textField in textFields {
        self.kei[indexPath.row] = (Item(name: textField.text!,deletable: false, deletecell: true,completable: false, cellcolor: false)), at: indexPath.row)
        }
          self.mytableView.reloadData()

      }
    })
    alert.addAction(okAction)


    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    alert.addAction(cancelAction)


    alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in
      textField.placeholder = "テキスト"
    })


    alert.view.setNeedsLayout() /
    self.present(alert, animated: true, completion: nil)

      return indexPath
      }

  }



  func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
      self.kei.remove(at: indexPath.row)
      tableView.deleteRows(at: [indexPath], with: .fade)
   }
  }

   //func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
     func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
      let delete = UIContextualAction(style: .normal,title: "削除", handler: { (action: UIContextualAction, view: UIView, success :(Bool) -> Void) in
         self.kei.remove(at: indexPath.row)
         tableView.deleteRows(at: [indexPath], with: .fade)
         success(true)
      })

      let edit = UIContextualAction(style: .normal,title: "編集", handler: { (action: UIContextualAction, view: UIView, success :(Bool) -> Void) in

         let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)


         let okAction = UIAlertAction(title: "OK", style: .default, handler: {
            (action:UIAlertAction!) -> Void in


            if let textFields = alert.textFields {

               for textField in textFields {
                 self.kei[indexPath.row] = (Item(name: textField.text!,deletable: false, deletecell: true,completable: false, cellcolor: false))
                  //self.kei.append(textField.text!)
               }
               self.mytableView.reloadData()

            }
         })
         alert.addAction(okAction)


         let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
         alert.addAction(cancelAction)


         alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in
            textField.placeholder = "テキスト"
         })


         alert.view.setNeedsLayout() 
         self.present(alert, animated: true, completion: nil)
         print("edit")

         success(true)
      })

      delete.backgroundColor = .red
      edit.backgroundColor = .blue

      let swipeAction = UISwipeActionsConfiguration(actions: [delete])
      swipeAction.performsFirstActionWithFullSwipe = false

      return UISwipeActionsConfiguration(actions: [delete,edit])
      }



  // trueを返すことでCellのアクションを許可しています
  func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

   if kei.count > (indexPath.row + 1) {
      return true
   }else{
    return false
  }
   }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }
   //左から右へスワイプ
      func tableView(_ tableView: UITableView,
                     leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

         let delete = UIContextualAction(style: .normal,title: "削除", handler: { (action: UIContextualAction, view: UIView, success :(Bool) -> Void) in
            self.kei.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            success(true)
         })

         let edit = UIContextualAction(style: .normal,title: "編集", handler: { (action: UIContextualAction, view: UIView, success :(Bool) -> Void) in

            let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)

            // OKボタンの設定
            let okAction = UIAlertAction(title: "OK", style: .default, handler: {
               (action:UIAlertAction!) -> Void in

               // OKを押した時入力されていたテキストを表示
               if let textFields = alert.textFields {

                  for textField in textFields {
                     self.kei[indexPath.row] = (Item(name: textField.text!,deletable: false, deletecell: true,completable: false, cellcolor: false))

                  }
                  self.mytableView.reloadData()

               }
            })
            alert.addAction(okAction)

            let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
            alert.addAction(cancelAction)


            alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in
               textField.placeholder = "テキスト"
            })
            alert.view.setNeedsLayout() 
            self.present(alert, animated: true, completion: nil)
            print("edit")

            success(true)
         })

         delete.backgroundColor = .orange
         edit.backgroundColor = .blue

         return UISwipeActionsConfiguration(actions: [delete,edit])

   }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

UIContextualActionHandler で success(true) とすることで処理の完了を通知し、スワイプの状態が解除されます。

let delete = UIContextualAction(style: .normal,title: "削除", handler: { (action: UIContextualAction, view: UIView, success :(Bool) -> Void) in
  self.kei.remove(at: indexPath.row)
  tableView.deleteRows(at: [indexPath], with: .fade)
  success(true)
})

なお、
tableView(_:leadingSwipeActionsConfigurationForRowAt:) は iOS 11 からの機能になるため、それ以前の iOS では利用できません。
これはドキュメントの SDK iOS 11.0+ と表記されていることから読み取れます。

特定の cell だけこの機能を有効にしたい場合は、チェックマークの時と同じようにプロパティを追加するのが見通しは良くなるかなと思います。

追加したセルだけスワイプで削除するサンプルコード

下記差分の赤枠部分が、追加した cell のみ削除できるようにしています。
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/23 11:04

    ios11にする必要とsuccess(true)が必要だったんですね!
    それと以前にチェックマークでの質問でもお聞きしたのですが+ボタンで追加したcellだけを左にスワイプできるようにしたいのですがその場合過去に遡ってチェック出きるかをプロパティする必要があると教えて頂いたのですが私なりに色々調べたり、試してみたのですがどうしてもできる方法が思い浮かばないのでもし宜しければ再度もう少し具体的に教えて頂けないでしょうか?

    キャンセル

  • 2017/10/23 22:12

    回答に追記しました。参考にしてみてください。

    キャンセル

  • 2017/10/24 14:15

    教えて頂いたコードで組んでみたのですが私が実現したかったこととしては、+ボタンで追加したcellに対してだけ左から右にスワイプできるようにしたいです。
    それとチェックマークに関しても前回の質問で教えて頂いたのを参考にし、全てのcellをチェック出来ないようにしたのですが、それから先の遡って、チェック可能なデータなのかプロパティに関しての追加はどのようにすればいいのでしょうか?
    私の説明不足でお忙し中わざわざ回答して頂いたのにすいません。もし宜しければもう一度教えて頂けないでしょうか?

    キャンセル

  • 2017/10/24 14:30

    追記したサンプルコードでは追加したcellに対してだけスワイプできるようにできていますよ。ポイントとなる差分をキャプチャ付きで追記したので参考にしてみてください。

    キャンセル

  • 2017/10/24 14:57

    出来ました。leadingSwipeActionsConfigurationForRowAtとeditingStyleForRowAtのコードを追加するのを忘れてました。
    それとなんですが、item.swiftでのcomplete = true がtrueかfalseでチェックがつくかどうかは分かったのですがどうすればタイトル以降にだけチェックつけたり、外したりが出来るのでしょうか?質問の内容が違うのはマナー違反だと思いますがもし宜しければチェックマークについても教えて頂けないでしょうか?

    キャンセル

  • 2017/10/24 15:18

    Good!

    同じように赤枠の部分が該当します。サンプルコードでは todo というラベル名にしていますが、ここがタイトル以降の部分でチェックマークを有効にしています。

    キャンセル

  • 2017/10/24 15:41

    出来ました。こうすれば出来るんですね!
    @ykwsさんのおかげで少しですが構造体について理解できたような気がすます。
    それとなんですがcellのcolorもこのようにすれば出来るっていうことですよね?
    あと、出来るかどうかだけお聞きしたのですが例えばタイトルの部分を左から右にスワイプして削除する時にタイトルから[cell追加ボタン]までを一括りにして一括削除できるのでしょうか?

    キャンセル

  • 2017/10/24 23:53

    はい。どれもできますね。まとめて削除はまとめて削除すれば良いだけですが、ポイントはどうやってひとまとまりか判定するところだと思います。
    構造体の親子関係を作るか、 TableView 自体にセクションを導入するとシンプルにまとまると思います。やってみてわからなかったらまた質問してください。
    またサンプルコードで気になる点があったら、 Github リポジトリのトップページに gitter badge を追加したのでこちらから chat で呼びかけてくれても良いです。

    キャンセル

  • 2017/10/28 22:12

    タイトルのcolorは変えれたのですが、まとめて削除は構造体の入れ子がちょっと分からなくてどうすればいいのか分からないのでもし宜しければ教えて頂けないでしょうか?

    キャンセル

  • 2017/10/28 22:21

    質問欄には字数が収まらなったので回答にitem.swiftのコードに関しては回答に載せました。

    キャンセル

  • 2017/12/09 21:24 編集

    @ykws さん
    tableViewでまた分からないことがあるのでもし宜しければお忙しいと思いますが教えていただけないでしょうか?
    他の回答者にdidSelectRowAtIndexPath の関数が呼ばれてないと指摘されたのですがなぜ呼ばれてないのかが分からなくて困っています。
    https://teratail.com/questions/103978

    キャンセル

  • 2017/12/10 00:12

    解決したようですね :)

    キャンセル

0

```item.swift  
struct Item {  
var name: String  
var completable:Bool  
var deletable: Bool  
var deletecell: Bool  
var cellcolor: Bool  
var complete: Bool  

init(name: String,deletable: Bool,deletecell: Bool,completable: Bool,cellcolor: Bool) {  
self.name = name;  
self.deletable = deletable  
self.deletecell = deletecell  
self.completable = completable  
self.cellcolor = cellcolor  
complete = false  
}  

mutating func toggle() {  
if completable {  
complete = !complete  

}  
}  
}  

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6102questions

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

  • Xcode

    3518questions

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

  • iOS

    3474questions

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

  • iPhone

    870questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

  • TableView

    93questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。