2016-01-13 59 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。

一旦你這樣做,那麼你可以看到更新的內容。