使用UserDefaults填充值时,表视图reloadData()不起作用

时间:2017-01-17 01:19:22

标签: ios swift uitableview tableview nsuserdefaults

我正在开发一个向用户显示新闻源的项目。

我正在调用函数getNewsFeeds()来获取新闻源。

我会每隔一小时生成新的新闻源

    ViewDidLoad(){

    get current time in "HH" format and store it in currentTime

    Store this currentTime in to a HoursVar variable using UserDefaults

    }

    ViewDidAppear(){

    if( currentTime - HoursVar >= 1){
    getNewsFeeds
   }else{

    }
    retreiveStoredValuesFromUserDeafults()
    } 

在从保存的Userdefaults中获取数据时,我不知道从哪里设置我的tableViewDataSOurce和Delegate方法以及reloadData以填充tableView retreiveStoredValuesFromUserDeafults()

 override func viewDidLoad() {
    super.viewDidLoad()



    hoursFormatter.dateFormat = "HH"
    hoursVar = Int(hoursFormatter.string(from: hours))!

    if hoursVar > 12 {
        hoursVar = hoursVar - 12
    }

    self.defaults.set(self.hoursVar, forKey: "hoursVar")

    customNavBar()
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    feedsArray = ["Reliance","Economy"]

}

override func viewDidAppear(_ animated: Bool) {

    //getRssFeeds()

    if((hoursVar - myHoursVar) == 1 && (hoursVar - myHoursVar) > 1){

        getRssFeeds()

    }else{



        feedsTable.register(UITableViewCell.self, forCellReuseIdentifier: "newsFeeds")

            self.feedsTable.delegate = self
            self.feedsTable.dataSource = self

        retreiveMyArrayData()

        feedsTableView.reloadData()
    }

}

func getRssFeeds(){

    for i in 0..<feedsArray.count{

        let url = URL(string: "https://api.cognitive.microsoft.com/bing/v5.0/news/search?q=\(feedsArray[i])&count=3&mkt=en-in")
        var request = URLRequest(url: url!)
        request.setValue("My Subscription Key", forHTTPHeaderField: "Ocp-Apim-Subscription-Key")

        Alamofire.request(request as URLRequest).responseJSON{response in

            if let json = response.result.value as? [String:AnyObject]{


                if let value = json["value"]{

                    //
                    print("json \(json)")

                    for j in 0..<value.count{

                        let items = value[j] as! [String:AnyObject]

                        let name = items["name"] as! String

                        let url = items["url"] as! String



                        let description = items["description"] as! String

                        let datePublished = items["datePublished"] as! String

                        let dateAndTime = datePublished.replacingOccurrences(of: "T", with: " ")

                        self.feedsName.append(name)
                        self.feedsUrl.append(url)
                        self.feedsDescription.append(description)
                        self.feedsDatePublished.append(dateAndTime)


                        if let image = items["image"] as? [String:AnyObject]{

                            if let thumbnail = image["thumbnail"] as? [String:AnyObject]{

                                let contentUrl = thumbnail["contentUrl"] as! String

                                self.feedsContentUrl.append(contentUrl)



                            }
                        }else{
                            self.feedsContentUrl.append(self.errorImage)

                        }


                        if let provider = items["provider"]{

                            for i in 0..<provider.count{

                                let items = provider[i] as! [String:AnyObject]
                                let providerName = items["name"] as! String

                                self.feedsProvider.append(providerName)

                            }


                        }

                        self.feedsTable.delegate = self
                        self.feedsTable.dataSource = self
                        self.feedsTable.reloadData()


                        self.defaults.set(self.feedsUrl, forKey: "feedsUrl")
                        self.defaults.set(self.feedsDescription, forKey: "feedsDescription")
                        self.defaults.set(self.feedsName, forKey: "feedsName")
                        self.defaults.set(self.feedsProvider, forKey: "feedsProvider")
                        self.defaults.set(self.feedsContentUrl, forKey: "feedsContentUrl")
                        self.defaults.set(self.feedsDatePublished, forKey: "feedsDatePublished")







                        print("All Counts  \(self.feedsName.count)")


                    }
                }
            }

        }




    }






}
func slideOpen(){
    self.revealViewController().revealToggle(animated: true)
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


    return feedsName.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "newsFeeds") as! newsFeeds



    randomNumberArray = randomNumber()

    //self.feedsRandomArray.append(self.feedsRandom)

    print("feedsRandom \(feedsRandom)")

    selectedRow = randomNumberArray[indexPath.row]




    let url = URL(string: feedsContentUrl[randomNumberArray[indexPath.row]])

    do{
        let data = try Data(contentsOf: url!)

        cell.feedsImage.image = UIImage(data: data )

    }catch{
        print(error)
    }

    let tap = UITapGestureRecognizer(target: self, action: #selector(HomeViewController.tapFunction))

    let titleAttributes = [NSFontAttributeName: UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline), NSForegroundColorAttributeName: UIColor.purple]

    let titleString = NSAttributedString(string: feedsName[randomNumberArray[indexPath.row]] , attributes: titleAttributes)
    cell.feedsHeadlines.isUserInteractionEnabled = true
    cell.feedsHeadlines.addGestureRecognizer(tap)
    cell.feedsHeadlines.attributedText = titleString
    cell.feedsDescription.text = feedsDescription[randomNumberArray[indexPath.row]]
    cell.feedsPublisherName.text = feedsProvider[randomNumberArray[indexPath.row]]
    cell.publishedOn.text = feedsDatePublished[randomNumberArray[indexPath.row]]

    //print("All Counts  \(myFeedsName.count) \(myFeedsProvider.count) \(myFeedsContentUrl.count) \(myFeedsUrl.count) \(myFeedsDescription.count) \(myFeedsDescription.count)")

    return cell
}

func tapFunction(sender:UITapGestureRecognizer) {

    let safariVC = SFSafariViewController(url: NSURL(string: feedsUrl[selectedRow]) as! URL)
    self.present(safariVC, animated: true, completion: nil)
    safariVC.delegate = self


}

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {

    controller.dismiss(animated: true, completion: nil)
}

func randomNumber() -> [Int] {


    let feedsIndex = feedsName.count - 1
    var randomNumber = Int(arc4random_uniform(UInt32(feedsIndex)))

    print("Randome number \(randomNumber) \(randomNumberArray)")

    for k in 0..<randomNumberArray.count{
    while randomNumber == randomNumberArray[k] {
        randomNumber = Int(arc4random_uniform(UInt32(feedsIndex)))
    }
    }
    randomNumberArray.append(randomNumber)
    self.defaults.set(self.randomNumberArray, forKey: "randomNumberArray")


    return randomNumberArray
}

func retreiveMyArrayData(){


    myFeedsUrl = defaults.stringArray(forKey: "feedsUrl") ?? [String]()
    myFeedsDescription = defaults.stringArray(forKey: "feedsDescription") ?? [String]()
    myFeedsName = defaults.stringArray(forKey: "feedsName") ?? [String]()
    myFeedsProvider = defaults.stringArray(forKey: "feedsProvider") ?? [String]()
    myFeedsContentUrl = defaults.stringArray(forKey: "feedsContentUrl") ?? [String]()
    myFeedsDatePublished = defaults.stringArray(forKey: "feedsDatePublished") ?? [String]()
    myHoursVar = defaults.integer(forKey: "hoursVar")
    myFeedsRandom = defaults.array(forKey: "randomNumberArray") as! [Int]

   print("Values \(myHoursVar) \(myFeedsProvider) \(myFeedsUrl.count)")







}

2 个答案:

答案 0 :(得分:1)

您可以将UITableViewDataSourceUITableViewDelegate设置为.xib

Look this.

答案 1 :(得分:0)

  //Setting datasource & delegate for tableview inside viewDidLoad
  override func viewDidLoad() {
     super.viewDidLoad()
     self.feedsTableView.delegate = self
     self.feedsTableView.datasource = self 

  }

现在,您需要在setValue&amp; amp;时重新加载tableview。检索userDefaults的值。 self.feedsTableView.reloadData()

如果这对您没有帮助,请告诉我。我会更多地为您提供上述项目的完整工作流程。

相关问题