14477


tableviewである場所のファイルの一覧を出すようにしてるのですが、remove機能でそのファイルを消したときにtableviewの内容を消したいのです。しかしself.tableView.reloadData()をしても更新されません。なぜでしょうか、、、  
解決方法を教えていただきたいです。

[code]

    import UIKit
    
    class SecondViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{
    
        @IBOutlet weak var tableView: UITableView!
        struct Constants {
            static var error: NSError?
            static let manager = NSFileManager.defaultManager().contentsOfDirectoryAtPath("/", error: nil)!
    
        }
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            print(Constants.manager)
            return Constants.manager.count
    
        }
        func tableView(table: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
            tableView?.deselectRowAtIndexPath(indexPath, animated: true)
            let alertController = UIAlertController(title: "rewrite or delete", message: "which do you choose.", preferredStyle: .ActionSheet)
            let firstAction = UIAlertAction(title: "ReWrite", style: .Default) {
                action in println("Pushed rewrite")
                var name = Constants.manager[indexPath.row]
                system("cp -rf \(name)")
                //書き換え
            }
            let secondAction = UIAlertAction(title: "Delete", style: .Default) {
                action in println("Pushed Delete")
                var name1 = Constants.manager[indexPath.row] as! String
                NSFileManager.defaultManager().removeItemAtPath("/" + name1, error: nil)
    
                //delete
            }
            let cancelAction = UIAlertAction(title: "CANCEL", style: .Cancel) {
                action in println("Pushed cancel")
            }
    
            alertController.addAction(firstAction)
            alertController.addAction(secondAction)
            alertController.addAction(cancelAction)
    
            presentViewController(alertController, animated: true, completion: nil)
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
            let manager = Constants.manager
            cell.textLabel?.text =  manager[indexPath.row] as! String
            return cell
        }
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            tableView.delegate = self
            tableView.dataSource = self
        }
        override func viewWillAppear(animated: Bool) {
            self.tableView.reloadData()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
[/code]

1つめの削除したあとにmanager変数を取得し直して最新の状態に更新するコードを書くと  
cannot assign to the result of this expression  
とでます。なぜでしょうか。たびたびすみません


CC BY-SA 3.0
2015-08-16T10:11:51.470
14471
2015-08-17T15:24:16.340
2015-08-17T15:24:16.340
9775
9775
question
swift
SwiftでUITableViewの内容が更新されない


`NSFileManager`の`contentsOfDirectoryAtPath(_ path:
String)`メソッドは、呼び出した時点にけるそのディレクトリに含まれる項目を取得するメソッドなので、その中のファイルを幾つか消したとしても、自動的に最新の内容に更新されたりしません。

ファイルを消した後に、最新の状態を反映するには、`manager`変数に再度代入するか、`manager`変数をComputed
Propertyにして、アクセスするたびにそのときの最新の状態を計算するように変更する必要があります。

たとえば、下記のように削除したあとに`manager`変数を取得し直して最新の状態に更新するか、

[code]

    let secondAction = UIAlertAction(title: "Delete", style: .Default) {
        action in println("Pushed Delete")
        var name1 = Constants.manager[indexPath.row] as! String
    
        NSFileManager.defaultManager().removeItemAtPath("/" + name1, error: nil)
    
        // 削除したあとにmanager変数を最新の状態に更新する
        Constants.manager = NSFileManager.defaultManager().contentsOfDirectoryAtPath("/", error: nil)!
    
        self.tableView.reloadData()
    
[/code]

あるいは下記のように`manager`変数をComputed Propertyにして、アクセスごとに処理が行われるようにします。

[code]

    struct Constants {
        static var error: NSError?
        static var manager: [AnyObject] {
            return NSFileManager.defaultManager().contentsOfDirectoryAtPath("/", error: nil)!
        }
    }
    
[/code]

ただ、他にもいろいろ問題があると思われるので、列挙します。

まず、提示されたコードでは削除した際に`reloadData()`が呼ばれませんので、その処理を書く必要があると思います。

また、ルートディレクトリ`"/"`に対して処理を行っていますが、基本的にルートディレクトリは書き込みが許可されていませんので、そもそも削除自体が失敗している可能性があります。

次のように、戻り値とエラーオブジェクトをチェックして、削除処理が成功しているかどうかを確かめてみましょう。

[code]

    var error: NSError? = nil
    let success = NSFileManager.defaultManager().removeItemAtPath("/" + name1, error: &error)
    println(success)
    println(error)
    
[/code]


CC BY-SA 3.0
2015-08-16T12:10:25.983
14477
2015-08-16T12:25:13.550
2015-08-16T12:25:13.550
7362
5519
14471
answer