2016-01-21 88 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循环,仍然在做陈述内外做报表后插入它会在我的应用程序中创建更多的问题。添加一个项目后列表不会更新...所以它的反应方式与我试图清除列表时的方式相同...只是在重新加载时才会执行任何操作...感谢您的帮助。 –