2016-01-13 49 views
2

如何当按下与活动的指标添加刷新按钮JSON表视图

下面是代码

我一个使用JSON,从我希望服务器获取数据我添加刷新栏按钮与活动的指标用户可以看到更新的内容时刷新按钮被按下

感谢

import UIKit 
import CoreData 


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var json_data_url = "http://example/json_table_view_images%20(1).json" 
    var image_base_url = "" 


    var TableData:Array<datastruct> = Array <datastruct>() 

    enum ErrorHandler:ErrorType 
    { 
     case ErrorFetchingResults 
    } 


    struct datastruct 
    { 
     var imageurl:String? 
     var description:String? 
     var image:UIImage? = nil 

     init(add: NSDictionary) 
     { 
      imageurl = add["url"] as? String 
      description = add["description"] as? String 
     } 
    } 

    @IBOutlet var tableview: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableview.dataSource = self 
     tableview.delegate = self 

     get_data_from_url(json_data_url) 
    } 


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 

     let data = TableData[indexPath.row] 


     cell.textLabel?.text = data.description 

     if (data.image == nil) 
     { 
      cell.imageView?.image = UIImage(named:"image.jpg") 
      load_image(image_base_url + data.imageurl!, imageview: cell.imageView!, index: indexPath.row) 
     } 
     else 
     { 
      cell.imageView?.image = TableData[indexPath.row].image 
     } 

     return cell 

    } 

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







    func get_data_from_url(url:String) 
    { 


     let url:NSURL = NSURL(string: url)! 
     let session = NSURLSession.sharedSession() 

     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "GET" 
     request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 


     let task = session.dataTaskWithRequest(request) { 
      (
      let data, let response, let error) in 

      guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
       print("error") 
       return 
      } 

      dispatch_async(dispatch_get_main_queue(), { 
       self.extract_json(data!) 
       return 
      }) 

     } 

     task.resume() 

    } 


    func extract_json(jsonData:NSData) 
    { 
     let json: AnyObject? 
     do { 
      json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) 
     } catch { 
      json = nil 
      return 
     } 

      if let list = json as? NSArray 
      { 
       for (var i = 0; i < list.count ; i++) 
       { 
        if let data_block = list[i] as? NSDictionary 
        { 

         TableData.append(datastruct(add: data_block)) 
        } 
       } 

       do 
       { 
        try read() 
       } 
       catch 
       { 
       } 

       do_table_refresh() 

      } 


    } 




    func do_table_refresh() 
    { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.tableview.reloadData() 
      return 
     }) 
    } 


    func load_image(urlString:String, imageview:UIImageView, index:NSInteger) 
    { 

     let url:NSURL = NSURL(string: urlString)! 
     let session = NSURLSession.sharedSession() 

     let task = session.downloadTaskWithURL(url) { 
      (
      let location, let response, let error) in 

      guard let _:NSURL = location, let _:NSURLResponse = response where error == nil else { 
       print("error") 
       return 
      } 

      let imageData = NSData(contentsOfURL: location!) 

      dispatch_async(dispatch_get_main_queue(), { 


       self.TableData[index].image = UIImage(data: imageData!) 
       self.save(index,image: self.TableData[index].image!) 

       imageview.image = self.TableData[index].image 
       return 
      }) 


     } 

     task.resume() 


    } 




    func read() throws 
    { 

     do 
     { 
      let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
      let managedContext = appDelegate.managedObjectContext! 
      let fetchRequest = NSFetchRequest(entityName: "Images") 

      let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) 

      for (var i=0; i < fetchedResults.count; i++) 
      { 
       let single_result = fetchedResults[i] 
       let index = single_result.valueForKey("index") as! NSInteger 
       let img: NSData? = single_result.valueForKey("image") as? NSData 

       TableData[index].image = UIImage(data: img!) 

      } 

     } 
     catch 
     { 
      print("error") 
      throw ErrorHandler.ErrorFetchingResults 
     } 

    } 

    func save(id:Int,image:UIImage) 
    { 
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     let managedContext = appDelegate.managedObjectContext! 

     let entity = NSEntityDescription.entityForName("Images", 
      inManagedObjectContext: managedContext) 
     let options = NSManagedObject(entity: entity!, 
      insertIntoManagedObjectContext:managedContext) 

     let newImageData = UIImageJPEGRepresentation(image,1) 

     options.setValue(id, forKey: "index") 
     options.setValue(newImageData, forKey: "image") 

     do { 
      try managedContext.save() 
     } catch 
     { 
      print("error") 
     } 

    } 


} 

回答

2

如果你想在导航栏中activity indicator

Objective-C的

UIActivityIndicatorView * v= [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[v startAnimating]; 
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:v]; 

斯威夫特,

var myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle:UIActivityIndicatorViewStyle.Gray) 
    myActivityIndicator.center = view.center 
    myActivityIndicator.startAnimating() 
    var barButtonItem = UIBarButtonItem(customView: view) 
    self.navigationItem.rightBarButtonItem = barButtonItem 

现在,当点击 '刷新' 按钮,使用上面的代码显示活动指示器在导航栏上。

使用上面的代码示例swift类。

import Foundation 

进口的UIKit

类的ViewController:UIViewController的{

func addRefreshHeader() { 
    let myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle:UIActivityIndicatorViewStyle.Gray) 
    myActivityIndicator.startAnimating() 
    let barButtonItem = UIBarButtonItem(customView: myActivityIndicator) 
    self.navigationItem.leftBarButtonItem = barButtonItem 
} 
} 
+0

需要SWIFT代码 – system21

+0

如何实现这个代码我是新来的Xcode – system21

+0

添加上面的代码到你选择的任何方法和然后点击“刷新”按钮,只需调用该方法即可。如果你喜欢答案接受它。谢谢 –

3

看,你所要做的按钮动作里面两件事情,你甲肝e调用功能'get_data_from_url()',然后您必须重新加载tableview。您可以使用tableview.reloadData()重新加载tableview。

一旦你这样做,那么你可以看到更新的内容。