Неверный индекс в didSelectRowAtIndexPath с использованием NativeExpress admob

'NSRangeException', причина: '*** -[__NSArrayM objectAtIndex:]: индекс 43 выходит за пределы [0 .. 39]'

Почему в приведенном ниже коде всегда выполняется блок else, а при использовании того же кода внутри блока CellForRowAtIndexPath он работает нормально?

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let tableItem = dataArray[indexPath.row] as? GADNativeExpressAdView {
        valueToPass = indexPath.row
        self.performSegueWithIdentifier("showDetails", sender: self)
    } else {
        valueToPass = indexPath.row
        self.performSegueWithIdentifier("showDetails", sender: self)
    }
}


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

    if let nativeExpressAdView = dataArray[indexPath.row] as? GADNativeExpressAdView {
        let reusableAdCell = tableView.dequeueReusableCellWithIdentifier("NativeExpressAdViewCell", forIndexPath: indexPath)

        // Remove previous GADNativeExpressAdView from the content view before adding a new one.
        for subview in reusableAdCell.contentView.subviews {
            subview.removeFromSuperview()
        }

        reusableAdCell.contentView.addSubview(nativeExpressAdView)
        // Center GADNativeExpressAdView in the table cell's content view.
        nativeExpressAdView.center = reusableAdCell.contentView.center

        return reusableAdCell

    }
    else {

        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? ProductCell
        dataDict = dataArray[indexPath.row] as! NSMutableDictionary
        cell!.productName?.text = dataDict.objectForKey("name") as? String
        let member : NSString
        member = (dataDict.objectForKey("Member") as? String)!
        cell!.productMemberName?.text = "Member: " + (member as String)
        cell!.productFavorite?.setBackgroundImage(UIImage(named: ""), forState: UIControlState.Normal)
        cell!.productImage?.image = UIImage(named: (dataDict.objectForKey("name") as? String)! + ".jpg")
        let imageName = "cellArrow"
        let image = UIImage(named: imageName)
        let imageView = UIImageView(image: image!)
        cell?.accessoryView = imageView
        return cell!
    }
}

Любая идея, что я должен изменить в didSelectRowAtIndexPath()?


person hardik    schedule 03.05.2017    source источник
comment
Можете ли вы предоставить больше кода? tableView:cellForIndexPath: и tableView:numberOfRowInSection: функции.   -  person Sergey    schedule 03.05.2017
comment
проверить обновленный вопрос   -  person hardik    schedule 03.05.2017


Ответы (3)


Пожалуйста, верните вам массив (dataArray) count, и тогда вы никогда не получите сбой

func tableView(tableView:UITableView!, numberOfRowsInSection section: Int) -> Int {
     return dataArray.count
}
person Dharmbir Singh    schedule 03.05.2017
comment
нет проблем. эта работа отлично. но мой метод didselect не работает. - person hardik; 03.05.2017
comment
Какие данные вы вставили в dataArray?? - person Dharmbir Singh; 03.05.2017
comment
простая загрузка строковых данных из БД. я использую то же условие в cellForRowAtIndexpath и его работе, но в методе didselect он всегда выполняет другую часть. это проблема - person hardik; 03.05.2017
comment
Вставьте свой метод cellForRowAtIndexPath - person Dharmbir Singh; 03.05.2017

Похоже, что dataArray был вашим источником данных для 40 обычных ячеек. Если это так, то источник данных для рекламных ячеек будет отсутствовать. Если это не так, то я не вижу никакой логики, с помощью которой можно было бы отличить обычный контент от рекламного.

И, наконец, все утверждение if кажется не слишком логичным. Хотя вы пытаетесь отличить объявления от обычных ячеек, обе ветки then и else выполняют одни и те же действия. Пожалуйста, дайте мне знать, чего именно вы хотели бы достичь.

person Tom E    schedule 03.05.2017
comment
мой admob NativeExpress успешно отображается, но когда я выбираю одну ячейку, я получаю сообщение об ошибке, например: «NSRangeException», причина: «*** -[__NSArrayM objectAtIndex:]: индекс 43 за пределами [0 .. 39]» - person hardik; 03.05.2017

Спасибо всем. моя проблема решена, выполнив это в didselect()

 let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("FirstDetailViewController") as! FirstDetailViewController
    dataDict = dataArray.objectAtIndex(indexPath.row) as! NSMutableDictionary
    let mainPk: String? = dataDict.objectForKey("mainpk") as? String
    let finalIndex = Int((mainPk)!)
    secondViewController.selectedIndex = finalIndex! - 1
    self.navigationController!.pushViewController(secondViewController, animated: true)
person hardik    schedule 04.05.2017