无法转换swift类型的值

时间:2015-07-05 17:37:23

标签: ios swift uitableview custom-cell

尝试滚动后出错: 无法将“Reviews.topCell”类型(0xaeb68)的值转换为“Reviews.contentCell”(0xaea98)。 (见最后一种方法) 我认为我引用了正确的细胞,尽管问题可能在于 cellForRowAtIndexPath方法,因为在尝试滚动后执行挂起。

完整源代码:http://pastebin.com/3BLUs5JY

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let nodeCount = arrayOfPosts.count;
    //    if (indexPath.row < 0)
     //   {
          //  let cell:topCell = tableView.dequeueReusableCellWithIdentifier("topCell", forIndexPath: indexPath) as! topCell
          //  cell.userName.text = "Loading..."
      //  }
       //  else
      //   {
            // Leave cells empty if there's no data yet
         //   if (nodeCount > 0)
          //  {
                if (indexPath.row % 2 == 0){
                    // Set up the cell representing the app
                    let cell = tableView.dequeueReusableCellWithIdentifier("topCell", forIndexPath: indexPath) as! topCell
                    let post = arrayOfPosts[indexPath.row]
                    cell.userName.text = post.userName
                    cell.timeSincePosted.text = post.timeSincePosted
                    // Only load cached images; defer new downloads until scrolling ends
                    if (post.profileImage == nil)
                    {
                        if (!tableView.dragging && !tableView.decelerating)
                        {
                            downloadProfileImage(post, indexPath: indexPath)
                            cell.profileImage.image = post.profileImage
                            return cell
                        }
                        // if a download is deferred or in progress, return a placeholder image
                        cell.profileImage.image = UIImage(named: "titanic.jpg")
                                           }
                    else
                    {
                           cell.profileImage.image = post.profileImage
                    }
                    return cell
                }
                // Set up the cell representing the app
                let cell = tableView.dequeueReusableCellWithIdentifier("contentCell", forIndexPath: indexPath) as! contentCell
                let post = arrayOfPosts[indexPath.row]
                // Only load cached images; defer new downloads until scrolling ends
                if (post.posterImage == nil)
                {
                    if (!tableView.dragging && !tableView.decelerating)
                    {


                        downloadPosterImage(post, indexPath: indexPath)
                        cell.posterImage.image = post.posterImage
                        return cell
                       /*
                        let url = NSURL(string: "http://www.freemovieposters.net/posters/titanic_1997_6121_poster.jpg")
                        let data = NSData(contentsOfURL: NSURL(string: "http://www.impawards.com/1997/posters/titanic_ver7.jpg")!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                        cell.posterImage.image = UIImage(data: data!)
                        return cell
                        */
                    }
                    // if a download is deferred or in progress, return a placeholder image


                    cell.posterImage.image = UIImage(named: "img1.jpg")
                }
                else
                {
                    cell.posterImage.image = post.posterImage
            }
        return cell
        }
Could not cast value of type 'Reviews.topCell' (0xaeb68) to 'Reviews.contentCell' (0xaea98).    


    func loadImagesForOnscreenRows(){
                if (arrayOfPosts.count > 0){
            let visiblePaths:NSArray = tableView.indexPathsForVisibleRows()!
                for indexPath in visiblePaths {
            let post = arrayOfPosts[indexPath.row]

                    if (indexPath.row % 2 == 0){

                        let cell:topCell = self.tableView.cellForRowAtIndexPath(indexPath as! NSIndexPath) as! topCell
                        if (cell.profileImage != post.profileImage){
                            downloadProfileImage(post, indexPath: indexPath as! NSIndexPath)
                             cell.profileImage.image = post.profileImage
                        }
                    }
                    let cell: contentCell = tableView.cellForRowAtIndexPath(indexPath as! NSIndexPath) as! contentCell
                    if (cell.posterImage != post.posterImage){
                    downloadPosterImage(post, indexPath: indexPath as! NSIndexPath)
                     cell.posterImage.image = post.posterImage
                      }
                    }
                }
            }

1 个答案:

答案 0 :(得分:1)

loadImagesForOnscreenRows()方法中的

可能缺少else

if (indexPath.row % 2 == 0){
   let cell:topCell = self.tableView.cellForRowAtIndexPath(indexPath as! NSIndexPath) as! topCell
   if (cell.profileImage != post.profileImage) {
      downloadProfileImage(post, indexPath: indexPath as! NSIndexPath)
      cell.profileImage.image = post.profileImage
   }
} else { // <--
   let cell: contentCell = tableView.cellForRowAtIndexPath(indexPath as! NSIndexPath) as! contentCell
   if (cell.posterImage != post.posterImage){
      downloadPosterImage(post, indexPath: indexPath as! NSIndexPath)
      cell.posterImage.image = post.posterImage
    }
}

并且请遵守命名惯例:

propertymethod名称以小写字母

开头

ClassStructEnumProtocol名称以大写字母开头