I have a problem with a code is a RSS reader app for IOS. I have an error Thread 1: Fatal error: Index out of range.
I wrote on which line the error is. By the way, this error does happen with all the RSS link I put for example with sky news RSS URL it works well but with some site (like the one I put now) it is not running and write Fatal error: Index out of range ERROR.
The Code:
import UIKit
class FeedListViewController: UITableViewController, XMLParserDelegate {
var myFeed : NSArray = []
var feedImgs: [AnyObject] = []
var url: URL!
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140
tableView.backgroundColor = UIColorFromRGB(rgbValue: 0x00B6ED)
self.tableView.dataSource = self
self.tableView.delegate = self
loadData()
}
@IBAction func refreshFeed(_ sender: Any) {
loadData()
}
func loadData() {
url = URL(string: "https://www.widgeti.co.il/feed")!
loadRss(url);
}
func loadRss(_ data: URL) {
// XmlParserManager instance/object/variable
let myParser : XmlParserManager = XmlParserManager().initWithURL(data) as! XmlParserManager
// Put feed in array
feedImgs = myParser.img as [AnyObject]
myFeed = myParser.feeds
tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openPage" {
let indexPath: IndexPath = self.tableView.indexPathForSelectedRow!
let selectedFURL: String = (myFeed[indexPath.row] as AnyObject).object(forKey: "link") as! String
// Instance of our feedpageviewcontrolelr
let fivc: FeedItemViewController = segue.destination as! FeedItemViewController
fivc.selectedFeedURL = selectedFURL as String
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myFeed.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.backgroundColor = UIColor.clear
cell.detailTextLabel?.backgroundColor = UIColor.clear
if indexPath.row % 2 == 0 {
cell.backgroundColor = UIColor(white: 1, alpha: 0.1)
} else {
cell.backgroundColor = UIColor(white: 1, alpha: 0.2)
}
// Load feed iamge.
let url = NSURL(string:feedImgs[indexPath.row] as! String) //ERROR Thread 1: Fatal error: Index out of range
let data = NSData(contentsOf:url! as URL)
var image = UIImage(data:data! as Data)
image = resizeImage(image: image!, toTheSize: CGSize(width: 80, height: 80))
let cellImageLayer: CALayer? = cell.imageView?.layer
cellImageLayer!.cornerRadius = 35
cellImageLayer!.masksToBounds = true
cell.imageView?.image = image
cell.textLabel?.text = (myFeed.object(at: indexPath.row) as AnyObject).object(forKey: "title") as? String
cell.textLabel?.textColor = UIColor.white
cell.textLabel?.numberOfLines = 0
cell.textLabel?.lineBreakMode = .byWordWrapping
cell.detailTextLabel?.text = (myFeed.object(at: indexPath.row) as AnyObject).object(forKey: "pubDate") as? String
cell.detailTextLabel?.textColor = UIColor.white
return cell
}
func UIColorFromRGB(rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
func resizeImage(image:UIImage, toTheSize size:CGSize)->UIImage{
let scale = CGFloat(max(size.width/image.size.width,
size.height/image.size.height))
let width:CGFloat = image.size.width * scale
let height:CGFloat = image.size.height * scale;
let rr:CGRect = CGRect(x: 0, y: 0, width: width, height: height)
UIGraphicsBeginImageContextWithOptions(size, false, 0);
image.draw(in: rr)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
return newImage!
}
}
Can You help me solve this problem? Thanks!
Fatal error: Index out of range
This error only refers a thing that index, you want to access from the array does not exist.
let url = NSURL(string: feedImgs[indexPath.row] as! String)
In the above line feedImgs[indexPath.row]
does not exist, that why you are getting the error. Make sure that your feedImgs
array and myFeed
array both are of same length because you are loading the table from myFeed
array.
Or, You can can check like this.
if feedImgs.count > indexPath.row {
let url = NSURL(string: (feedImgs[indexPath.row] ?? ""))
}
来源:https://stackoverflow.com/questions/50449750/how-to-solve-fatal-error-index-out-of-range-in-swift-ios