【问题标题】:How to solve Fatal error: Index out of range in Swift IOS如何解决致命错误:Swift IOS 中的索引超出范围
【发布时间】:2018-05-21 13:15:10
【问题描述】:

我有一个问题,代码是 IOS 的 RSS 阅读器应用程序。我有一个错误线程 1:致命错误:索引超出范围。

我在哪一行写了错误。 顺便说一句,这个错误确实发生在我放置的所有 RSS 链接上,例如天空新闻 RSS URL,它运行良好,但在某些站点(如我现在放置的那个)上它没有运行并写入致命错误:索引超出范围错误。

守则:

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!
    }
}

你能帮我解决这个问题吗? 谢谢!

【问题讨论】:

  • 您检查过feedImgsmyFeed 的长度是否相同?
  • 为什么要使用AnyObjects 的数组?您不能使用Strings 数组作为图片的网址吗?
  • 索引错误意味着索引(整数)太高(超出数组末尾)或太低(负数)。

标签: ios swift rss rss-reader


【解决方案1】:

致命错误:索引超出范围

这个错误只指一个索引的东西,你想从数组中访问的东西不存在。

let url = NSURL(string: feedImgs[indexPath.row] as! String)

在上面的行中feedImgs[indexPath.row] 不存在,这就是您收到错误的原因。确保您的 feedImgs 数组和 myFeed 数组的长度相同,因为您正在从 myFeed 数组加载表。

或者,你可以这样检查。

if feedImgs.count > indexPath.row {
    let url = NSURL(string: (feedImgs[indexPath.row] ?? ""))
}

【讨论】:

  • 是的,他正在尝试访问一个尚未准备好访问的元素......他需要检查线程是否已经将该元素分配给数组
【解决方案2】:

致命错误:索引超出范围

如果您的索引超出范围,则会发生此错误

如果一个数组有 3 个整数值 100、150、300,那么它会这样存储

array[0]=100
array[1]=150
array[2]=300

所以索引范围是[0 to array.count - 1],即0,1,2

如果索引为负数或大于或等于数组计数,则会发生这种情况。这意味着会发生错误if indx < 0 || indx >= array.count

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多