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

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

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

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

Q&A

1回答

4713閲覧

tableviewのセルを長押ししたときの処理

nanshime_2621

総合スコア32

Swift

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

0グッド

0クリップ

投稿2016/01/26 00:25

tableViewを使って、Windowsのエクスプローラのようなものをつくろうとしています。

あるフォルダの中身をtableViewで表示し、セルを選択したときに、選択したものがフォルダである場合は、選択したフォルダの中身を表示します。戻るボタンを押下すると、ひとつ前のフォルダに戻ります。

また、セルを長押ししたときに、セルを選択状態(背景色を変更など、視覚的にわかりやすい方法であればいいと思っています。)にし、削除ボタンを押下すると選択状態だったセルを削除します。

長押し時の処理で行き詰まったので、ご教授お願いします。
選択したセルのindexPathを取得することまではできたのですが、セル自体を変更する方法がわかりません。

以下、途中までのコードです。

import UIKit

class ViewController: UIViewController ,UITableViewDelegate , UITableViewDataSource,UIGestureRecognizerDelegate{

//テーブルビューインスタンス作成 var tableView :UITableView = UITableView() var button1 : UIButton = UIButton() var label1 : UILabel = UILabel(frame: CGRectMake(0, 260, 200, 20)) //テーブルに表示するセルの配列を準備 var items:[String] = [] var items_sub : [String] = [] //初回起動時のフォルダ準備 var defaultFolder = "/Users/xxx/Desktop/Folder1/" //戻るボタン押下時の戻り先path var folder_pre1 = "" override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //テーブルビュー1の初期化 tableView.frame = CGRectMake(0, 50, 200, 200) tableView.delegate = self tableView.dataSource = self self.view.addSubview(tableView) tableView.tag = 1 getAllFile(defaultFolder) //戻るボタン1の初期化 button1.setTitle("Back", forState: .Normal) button1.frame = CGRectMake(200, 50, 50, 20) self.view.addSubview(button1) button1.addTarget(self, action: "onClickButton1:", forControlEvents: .TouchUpInside) //ラベル1の初期化 label1.text = defaultFolder self.view.addSubview(label1) label1.backgroundColor = UIColor.whiteColor() label1.font = UIFont.systemFontOfSize(8) //UILongPressGestureRecognizer(長押しイベント)宣言 var longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "cellLongPressed:") longPressGestureRecognizer.delegate = self //tableviewにrecognizerを設定 tableView.addGestureRecognizer(longPressGestureRecognizer) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //セルの行数 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } //セルの内容を変更 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell : UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") cell.textLabel?.text = items[indexPath.row] cell.detailTextLabel?.text = items_sub[indexPath.row] return cell } //セル選択時 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { var isDir = isDirectory(defaultFolder + items[indexPath.row]) if(isDir == true){ folder_pre1 = defaultFolder defaultFolder = defaultFolder + items[indexPath.row] + "/" label1.text = defaultFolder println(defaultFolder) println(folder_pre1) } else{ } getAllFile(defaultFolder) self.tableView.reloadData() } //セル長押し時 func cellLongPressed(sender : UILongPressGestureRecognizer){ //押された位置でcellのpathを取得 let point = sender.locationInView(tableView) let indexPath = tableView.indexPathForRowAtPoint(point) if sender.state == UIGestureRecognizerState.Began{ //セルが長押しされたときの処理 } else{ } } //button1押下時イベント func onClickButton1(sender:UIButton){ label1.text = folder_pre1 getAllFile(folder_pre1) defaultFolder = folder_pre1 self.tableView.reloadData() println(folder_pre1) //1つ上の階層のpathに更新 var endpoint = count(defaultFolder) - 1 var path = (defaultFolder as NSString).substringToIndex(endpoint) var position = (path as NSString).rangeOfString("/",options:NSStringCompareOptions.BackwardsSearch).location println(position) println((count(folder_pre1)).description) folder_pre1 = (defaultFolder as NSString).substringToIndex(position + 1) println(folder_pre1) } //指定したPathがフォルダかどうか func isDirectory(path : String) -> Bool{ var path = path var isDir :ObjCBool = false if NSFileManager.defaultManager().fileExistsAtPath(path, isDirectory: &isDir){ if isDir{ return true } else{ return false } } else{ return false } } //フォルダ1内のファイル一覧を取得 func getAllFile(folder : String){ let manager = NSFileManager.defaultManager() let defaultFolder = folder let list = manager.contentsOfDirectoryAtPath(defaultFolder, error: nil)! if(items.isEmpty == false){ items.removeAll() } for path in list{ items.append(path as! NSString as String) var fullPath = defaultFolder + (path as! String) let attribute : NSDictionary = manager.attributesOfItemAtPath(fullPath, error: nil)! let stringDate = changeToString(attribute.fileModificationDate()!) items_sub.append(stringDate + " / " + attribute.fileSize().description) } }

//NSDateをString型に変更
func changeToString(date : NSDate) -> String{
let date = date
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-DD HH:mm:ss"

let stringDate :String = formatter.stringFromDate(date) return stringDate }

}

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

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

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

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

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

guest

回答1

0

選択したセルのindexPathを取得することまではできたのですが、セル自体を変更する方法がわかりません。

長押しした時点で対象セルの背景色を変更することも可能ですが、それだとセルを表示領域の外にスクロールして、再度表示領域に戻した時に新しい別のセルを使って再表示するので、背景色は元に戻ってしまいます。逆に背景色を変更したセルが別のセルで再利用された時に、長押ししてないのに最初から背景色が変更された状態になる可能性もあります。

こういうことをしたい時は、選択状態を保持した配列をプロパティで持ち、長押しした時に対象行を選択済みにします。
そして、
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellのメソッドの中で選択状態に応じてcellの背景色を設定すればよいです。

ちなみに、「Windowsのエクスプローラのようなものをつくろうとしています」とのことですが、UIKit Frameworkを使っているということは、iOS用アプリを作ろうとしているのですよね?
iOS用アプリは、アプリの外のファイルやフォルダにアクセスできないことは理解されていますか?
つまり、自分が格納したファイルやアプリ内部のライプラリで格納したファイル以外にはアクセスできないので、Windowsのエクスプローラーのようにシステムファイルや他のアプリのファイルにはアクセスできませんよ。セキュリティ観点から、iOSはそのあたりのファイルアクセスを厳しく制限しています。(シミュレータで動作させる場合は、Macのアクセス制限で動作しますので、アプリの外のファイルにもアクセスできますが、実機ではできません。)

アプリ作成の勉強とアプリ内部のフォルダ構成の勉強を兼ねて作ろうとしているのでしたらとても勉強になると思いますが、Windowsのエクスプローラーのように便利なものにはならないと思いますよ。開発や調査のためにアプリ内部のファイルを参照したかったらXcodeのDeviceメニューから参照できます。

投稿2016/01/26 03:06

編集2016/01/26 03:25
TakeOne

総合スコア6299

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問