2016-01-21 84 views
1

我對開發Swift和iOS相對比較陌生,但並不是新的代碼。我有點討厭表格視圖。刪除列表後,UITableView將不會刷新。 self.tableView.reloadData()不起作用

我已經試過無數次使用self.tableView.reloadData()但無濟於事。我也試過

async call dispatch_async(dispatch_get_main_queue()) { 
    self.tableView.reloadData() 
} 

但是這也不想工作。我會發布功能,以便有人可以啓發我在哪裏搞錯了。我真的很感激幫助。

@IBAction func clearList(sender: AnyObject) { 
    let alert = UIAlertController(title: "Clear List?", 
    message: "Are you sure you want to clear the list?", 
    preferredStyle: .Alert) 

    let yesClearAction = UIAlertAction(title: "Yes", style: .Default, handler: { (action:UIAlertAction) -> Void in 
    self.clearListNow("GroceryList") 

    }) 

    let noClearAction = UIAlertAction(title: "No", style: .Default, handler: { (action:UIAlertAction) -> Void in 
     //do nothing aka don't clear list 
    }) 
    alert.addAction(yesClearAction) 
    alert.addAction(noClearAction) 

    presentViewController(alert, animated: true, completion: nil) 

    self.tableView.reloadData() 
} 

以防萬一有人想看看有什麼clearListNow呢......

func clearListNow(entity: String) { 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    let fetchRequest = NSFetchRequest(entityName: "GroceryList") 
    fetchRequest.returnsObjectsAsFaults = false 

    do 
    { 
     let results = try managedContext.executeFetchRequest(fetchRequest) 
     for managedObject in results 
     { 
      let managedObjectData:NSManagedObject = managedObject as! NSManagedObject 
      managedContext.deleteObject(managedObjectData) 
     } 
    } catch let error as NSError { 
     print("Detele all data in \(entity) error : \(error) \(error.userInfo)") 
    } 
} 

我也試圖在clearListNow功能使用self.tableView.reloadData()。我試圖在同一時間和兩種情況下單獨陳述陳述,並且兩種情況都沒有奏效。

+0

做你嘗試把你的代碼'dispatch_async內(dispatch_get_main_queue()){...})'塊,以避免異步加載? – iamalizade

+0

你是否已經設置了tableview的委託和數據源?並同時實施?請顯示這個實現。 – Darko

回答

1

刷新你的tableView當如圖到下面的代碼使用按是在提醒:

let yesClearAction = UIAlertAction(title: "Yes", style: .Default, handler: { (action:UIAlertAction) -> Void in 

     self.clearListNow("GroceryList") 
     self.tableView.reloadData() 

}) 
+0

我試圖做到這一點,它仍然不刷新表...'let yesClearAction = UIAlertAction(title:「Yes」,style:.Default,handler:{(action:UIAlertAction) - > self .clearListNow(「GroceryList」) self.tableView.reloadData() })' –

+0

您可以分享演示項目嗎? –

0

嘗試yesClearAction 重新加載數據,你應該有這樣的:

@IBAction func clearList(sender: AnyObject) { 
    let alert = UIAlertController(title: "Clear List?", 
    message: "Are you sure you want to clear the list?", 
    preferredStyle: .Alert) 

    let yesClearAction = UIAlertAction(title: "Yes", style: .Default, handler: {(action:UIAlertAction) -> Void in 
    self.clearListNow("GroceryList") 
    self.tableView.reloadData() 
}) 

let noClearAction = UIAlertAction(title: "No", style: .Default, handler: { (action:UIAlertAction) -> Void in 
    //do nothing aka don't clear list 
}) 
alert.addAction(yesClearAction) 
alert.addAction(noClearAction) 
presentViewController(alert, animated: true, completion: nil) 
} 

讓我知道如果這工作! :)

UPDATE

我已經做了這個代碼,它爲我

import UIKit 

class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{ 

@IBOutlet weak var tableView: UITableView! 
var rows: NSMutableArray! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.rows = ["1","2","3","4","5","6","7"] 
    self.tableView.reloadData() 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func clearList(sender: AnyObject) { 
    let alert = UIAlertController(title: "Clear List?", 
     message: "Are you sure you want to clear the list?", 
     preferredStyle: .Alert) 

    let yesClearAction = UIAlertAction(title: "Yes", style: .Default, handler: { (action:UIAlertAction) -> Void in 
     self.clearListNow("GroceryList") 
     self.tableView.reloadData() 

    }) 

    let noClearAction = UIAlertAction(title: "No", style: .Default, handler: { (action:UIAlertAction) -> Void in 
     //do nothing aka don't clear list 
    }) 
    alert.addAction(yesClearAction) 
    alert.addAction(noClearAction) 

    presentViewController(alert, animated: true, completion: nil) 


} 

func clearListNow(entity: String) { 
    self.rows.removeAllObjects() 
} 

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


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 
    let cell = tableView.dequeueReusableCellWithIdentifier("FruitCell", forIndexPath: indexPath) as? MyCell 
    cell!.textLabel?.text = self.rows[indexPath.row] as? String 
    return cell! 
} 

} 

我在這裏的故事板的屏幕截圖正常工作:

enter image description here

+0

我已經打過電話了clearlistnow功能後,把self.tableView.reloadData(),它仍然沒有刷新表:如果/ –

+0

,請檢查您的tableView的委託正確鏈接。 你應該有像self.tableView.delegate = self; AND self.tableView.dataSource = self。 你也可以在你的故事板上做到這一點 –

+0

或者可能是你的clearListNow方法並不真正刪除數據庫中的記錄! 在這方法一些斷點,檢查刪除,然後請求數據庫文件檢查記錄正確刪除... –

0

按你當前的代碼在AlertView後重新加載TableView Reload so,tableView Da taSource(數組)不改變和tableview顯示數據源(數組)數據。

嘗試後

self.clearListNow("GroceryList") 

self.clearListNow("GroceryList") 
self.tableView.reloadData() 

成FUNC clearListNow到relod表(實體:字符串)

for循環 即後

for managedObject in results 
{ 
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject 
managedContext.deleteObject(managedObjectData) 
} 
self.tableView.reloadData() 

so tableview獲取最新的數據源並顯示它。

讓我知道,如果這個工程...

+0

的結果,我已經厭倦了for循環,仍然在做陳述內外做報表後插入它會在我的應用程序中創建更多的問題。添加一個項目後列表不會更新...所以它的反應方式與我試圖清除列表時的方式相同...只是在重新加載時纔會執行任何操作...感謝您的幫助。 –