簡體   English   中英

ReloadData 無法與 Alamofire 一起使用 Swift

[英]ReloadData not working Swift with Alamofire

添加新項目后,我嘗試重新加載UITableView 當我嘗試使用reloadData()它不起作用。 什么都沒有顯示。 如果我嘗試重新加載我的getallrecords函數,則重新加載項目但它們會重復。 我的源代碼是:

class FriendsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate {
    @IBOutlet var tabeview: UITableView!
    var textArray: NSMutableArray! = NSMutableArray()
    var subArray: NSMutableArray! = NSMutableArray()
    let defaults = NSUserDefaults.standardUserDefaults()
    var valueToPass:String!
    var reports_d:String!
    var reports:String!

@IBOutlet var menuButton: UIBarButtonItem!
@IBOutlet var friends_icon: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()
     tabeview.dataSource = self
    tabeview.delegate = self
    tabeview.emptyDataSetSource = self
    tabeview.emptyDataSetDelegate = self
    tabeview.tableFooterView = UIView()

    getallrecords()
    self.tabeview.addPullToRefresh({ [weak self] in
        // refresh code
        self!.getallrecords()
        self?.tabeview.stopPullToRefresh()
        })
   // Do any additional setup after loading the view.
}



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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
    cell.textLabel?.text = self.textArray.objectAtIndex(indexPath.row) as? String
    cell.detailTextLabel?.text = self.subArray.objectAtIndex(indexPath.row) as? String
    return cell   
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow!
    let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell

    valueToPass = currentCell.textLabel!.text
    reports = reports_d
    performSegueWithIdentifier("friends_details", sender: self)
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.Delete) {
        // handle delete (by removing the data from your array and updating the tableview)
        let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell
        let friend2 = currentCell.textLabel!.text

        let defaults = NSUserDefaults.standardUserDefaults()
        let username = defaults.objectForKey("name") as! String
        Alamofire.request(.GET, "http://www.example.com/app/remove_friends.php", parameters: ["key_id": "xxxxx","user_id": username,"friend_receive_id": friend2!, "action": "delete"])
            .response { request, response, data, error in
                print(request)
                print(response)
                print(error)
                if(error == nil)
                {
                    self.tabeview.beginUpdates()
                    self.textArray.removeObjectAtIndex(indexPath.row)
                    self.subArray.removeObjectAtIndex(indexPath.row)
                    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
                    self.tabeview.endUpdates()

                }

        }

   NSNotificationCenter.defaultCenter().postNotificationName("reloadData",object: self)

    }
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){

    if (segue.identifier == "friends_details") {

        // initialize new view controller and cast it as your view controller
        let viewController = segue.destinationViewController as! DetailsFriendsViewController
        // your new view controller should have property that will store passed value
        viewController.passedValue = valueToPass
        viewController.reports = reports
    }

}
func getallrecords(){
        if(defaults.stringForKey("name") != nil ){
            let username = defaults.objectForKey("name") as! String
            let full = "http://www.example.com/app/danger_friend_view.php?search=true&username=" + username
            let url = NSURL(string: full)
            let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
                do {
                    let d = NSString(data: data!, encoding: NSUTF8StringEncoding)
                    var arr = d!.componentsSeparatedByString("<") // spliting the incoming string from "<" operator because before that operator is our required data and storing in array
                    let dataweneed:NSString = arr[0] as NSString // arr[0] is the data before "<" operator and arr[1] is actually no use for us
                    NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                        SwiftSpinner.hide()
                        do {
                            if let data = try NSJSONSerialization.JSONObjectWithData(dataweneed.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSJSONReadingOptions.MutableContainers]) as? NSArray {
                                for dd in data{
                                    var name : String = dd["danger"]! as! String
                                    self.reports_d = name
                                    let info : String = dd["username"]! as! String
                                    name = NSLocalizedString("SEND_ALERT_BEGIN",comment:"SEND_ALERT") + name + NSLocalizedString("ALERTS",comment:"ALERTS")
                                    print("ID is : \(name)")
                                    print("Username is : \(info)") 
                                    self.textArray.addObject(info)
                                    self.subArray.addObject(name)
                                }
                                self.tabeview.reloadData()
                            }
                        } catch let error as NSError {
                            print(error.localizedDescription)
                        }

                    })
                }
            }

            task.resume()
        }
    else
        {
   //Do something
        } 
     }

@IBAction func reload_data(sender: UIButton) {
    let banner = Banner(title: NSLocalizedString("RELOAD_DATA_TITLE",comment:"I'm in danger, I'm currently at  "), subtitle: NSLocalizedString("RELOAD_DATA",comment:"I'm in danger, I'm currently at  "), image: UIImage(named: "Icon"), backgroundColor: UIColor(red:52.00/255.0, green:152.00/255.0, blue:219.00/255.0, alpha:0.89))
    banner.dismissesOnTap = true
    banner.show(duration: 10.0)
    dispatch_async(dispatch_get_main_queue()) {
        //Not working ....
        self.tabeview.reloadData()
    }
}

func titleForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
    let str = "Oups"
    let attrs = [NSFontAttributeName: UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)]
    return NSAttributedString(string: str, attributes: attrs)
}

func descriptionForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
    let str = NSLocalizedString("NO_FRIENDS_TO_SHOW",comment:"No friends to show  ")
    let attrs = [NSFontAttributeName: UIFont.preferredFontForTextStyle(UIFontTextStyleBody)]
    return NSAttributedString(string: str, attributes: attrs)
}

func imageForEmptyDataSet(scrollView: UIScrollView!) -> UIImage! {
    return UIImage(named: "no-friends")
}

func buttonTitleForEmptyDataSet(scrollView: UIScrollView!, forState state: UIControlState) -> NSAttributedString! {
    let str = NSLocalizedString("ADD_FRIENDS",comment:"Add a friend  ")
    let attrs = [NSFontAttributeName: UIFont(name: "HelveticaNeue-Light", size: 19)!]
    return NSAttributedString(string: str, attributes: attrs)
}

func emptyDataSetDidTapButton(scrollView: UIScrollView!) {
    let alert = SCLAlertView()
    let txt = alert.addTextField("Friend's username")
    alert.addButton("Add") {
        if(txt.text=="")
        {
            let banner = Banner(title: NSLocalizedString("ERROR_NO",comment:"An error occured"), subtitle: NSLocalizedString("ERROR_NO_TEXT",comment:"I'm in danger, I'm currently at  "), image: UIImage(named: "Icon"), backgroundColor: UIColor(red:152.00/255.0, green:52.00/255.0, blue:52.00/255.0, alpha:0.89))
            banner.dismissesOnTap = true
            banner.show(duration: 10.0)
        }
        else
        {

            let defaults = NSUserDefaults.standardUserDefaults()
            let username = defaults.objectForKey("name") as! String
            let remove_friend_username = txt.text! as String

            Alamofire.request(.GET, "http://www.example.com/add_friends.php", parameters: ["key_id": "xxx","user_id": username,"friend_receive_id": remove_friend_username, "action": "add"])
                .response { request, response, data, error in
                    dispatch_async(dispatch_get_main_queue()) {
                        self.tabeview.reloadData()
                        //Not working
                    }
            }

        }
    }
    alert.showEdit("Add friend", subTitle: "You can add a friend by enter his username")
}

}

我相信你在這里遺漏了一點,伙計:)

問題 1為什么重新加載 tableView 不會顯示新數據??

您的函數 reload_data 所做的只是重新加載數據伙伴 :) 當您調用重新加載數據時,所有 tableView 委托都將調用,例如節中的行數、節數和 cellForRowAtIndexPath,但所有這些方法都會根據您提供的數據源返回值是不是哥們:)

因此,如果您更改數據源然后調用重新加載數據,它們將向您顯示新數據:) 但在您的 reload_data 函數中,您根本不會更改數據源:) 只需在未更改的數據源上調用重新加載數據即可重新呈現tableView 又是這樣:)

你可以做什么 :)

您已經有一個使用 almofire 獲取新數據的方法:) 只需調用它,並且在成功塊中無論如何您正在重新加載 tableView :) 所以一切都會好的,伙計 :)

@IBAction func reload_data(sender: UIButton) {
    let banner = Banner(title: NSLocalizedString("RELOAD_DATA_TITLE",comment:"I'm in danger, I'm currently at  "), subtitle: NSLocalizedString("RELOAD_DATA",comment:"I'm in danger, I'm currently at  "), image: UIImage(named: "Icon"), backgroundColor: UIColor(red:52.00/255.0, green:152.00/255.0, blue:219.00/255.0, alpha:0.89))
    banner.dismissesOnTap = true
    banner.show(duration: 10.0)
    self.getallrecords() //simply call this method this will anyhow will reload data on success :)
}

問題 2為什么我的 tableView 顯示重復數據???

您的 tableView 始終顯示其數據源中的數據 :) 因此,如果您的 tableView 顯示重復的單元格,則意味着您的數據源中有重復的條目 :)

您正在處理數組,將來您可能會遷移到 coredata :) 了解一件事,當您向數據源輸入或添加條目時,如果您不想顯示重復項,則必須明確處理它。

我怎樣才能做到這一點 ???

根據您的代碼,我相信每個對象的 info(username) 值都是唯一的。 因此,在盲目地向 textArray 添加響應之前,請檢查文本數組是否已經包含該對象,如果是,則不要再次添加:)

基於上述假設並相信您正在使用 swift 2.0

if let data = try NSJSONSerialization.JSONObjectWithData(dataweneed.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSJSONReadingOptions.MutableContainers]) as? NSArray {
                                    for dd in data{
                                        var name : String = dd["danger"]! as! String
                                        self.reports_d = name
                                        let info : String = dd["username"]! as! String
                                        name = NSLocalizedString("SEND_ALERT_BEGIN",comment:"SEND_ALERT") + name + NSLocalizedString("ALERTS",comment:"ALERTS")
                                        print("ID is : \(name)")
                                        print("Username is : \(info)") 

                                        if  !self.textArray.contains(info){                                                                                      

                                        self.textArray.addObject(info)
                                        self.subArray.addObject(name)
                                        } 

                                    }
                                    self.tabeview.reloadData()
                                }

現在有很多代碼,我想要一個更簡單的解決方案:)

在添加新響應之前清除數組:) 就是這樣:)

if let data = try NSJSONSerialization.JSONObjectWithData(dataweneed.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSJSONReadingOptions.MutableContainers]) as? NSArray {
                                self.textArray.removeAll()
                                self.subArray.removeAll() //clear the arrays and then re populate them thats all no duplicate data anymore :P
                                for dd in data{
                                    var name : String = dd["danger"]! as! String
                                    self.reports_d = name
                                    let info : String = dd["username"]! as! String
                                    name = NSLocalizedString("SEND_ALERT_BEGIN",comment:"SEND_ALERT") + name + NSLocalizedString("ALERTS",comment:"ALERTS")
                                    print("ID is : \(name)")
                                    print("Username is : \(info)") 
                                    self.textArray.addObject(info)
                                    self.subArray.addObject(name)
                                }
                                self.tabeview.reloadData()
                            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM