【问题标题】:Sigbart error during prepare for segue/unwind segue准备转场/展开转场期间的 Sigabrt 错误
【发布时间】:2020-11-05 02:04:38
【问题描述】:

我有一个应用程序,它是一个市场,当你点击一个产品时,它会打开一个详细视图控制器,传递数据以显示在 DetailVC 上。此外,在 DetailVC 中,如果您单击一个按钮来认领产品,它会转到另一个 VC 来完成交易。

在 DetailVC 中,有一个后退按钮,它是一个返回到主要市场 VC 的展开连接。在 TransactionVC 内部,有一个取消按钮,可将您带回 DetailVC。

当我单击 DetailVC 中的后退按钮以将我带回主要市场 VC 时,但我收到 SIGBART 错误,并且:
020-07-15 09:05:23.707490-0500 evolutionatx[707:141952] Could not cast value of type 'evolutionatx.MarketplaceViewController' (0x1032c7868) to 'evolutionatx.PopUpPurchaseViewController' (0x1032c7ba8).

这是 DetailVC 的代码

import UIKit
import iCarousel
import CoreData

class MarketDetailViewController: UIViewController, UIScrollViewDelegate, iCarouselDelegate, iCarouselDataSource {   

var productImageArray = [UIImage]()
var productVideo = String()
var pointsToPurchase = String()
var productName = String()
var productDescription = String()
var companyLogo = UIImage()
var companyWebsite = String()
var additionalProductImage = [UIImage]()
var companyName = String()
var promoCODE = String()
var buyLink = String()
var slides:[Slide] = [];

//IB
@IBOutlet weak var productNameLabel: UILabel!
@IBOutlet weak var productPriceLabel: UILabel!
@IBOutlet weak var productDescLabel: UILabel!
@IBOutlet weak var claimButton: UIButton!
@IBOutlet weak var imgScrollView: UIScrollView!
@IBOutlet weak var websiteButton: UIButton!
@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var logoDisplay: UIImageView!
@IBOutlet weak var carouselView: iCarousel!
@IBOutlet weak var otherProductslabe: UILabel!

var carouselImages = [UIImage]()
var evoCoin = Int()

override func awakeFromNib() {
    super.awakeFromNib()
    carouselImages = productImageArray
}
override func viewDidLoad() {
    super.viewDidLoad()
    valueSetter()
    
    imgScrollView.delegate = self
    slides = createSlides()
    
    setupSlideScrollView(slides: slides)
    
    pageControl.numberOfPages = slides.count
    pageControl.currentPage = 0
    
    view.bringSubviewToFront(pageControl)
}
    }
    
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let pageIndex = round(scrollView.contentOffset.x/view.frame.width)
        pageControl.currentPage = Int(pageIndex)
        
        let maximumHorizontalOffset: CGFloat = scrollView.contentSize.width - scrollView.frame.width
        let currentHorizontalOffset: CGFloat = scrollView.contentOffset.x
        
        // vertical
        let maximumVerticalOffset: CGFloat = scrollView.contentSize.height - scrollView.frame.height
        let currentVerticalOffset: CGFloat = scrollView.contentOffset.y
        
        let percentageHorizontalOffset: CGFloat = currentHorizontalOffset / maximumHorizontalOffset
        let percentageVerticalOffset: CGFloat = currentVerticalOffset / maximumVerticalOffset        
    }

@IBAction func claimProduct(_ sender: Any) {
    print("tap rec")
    claimProductandPurchase()        
}

func claimProductandPurchase(){

    evoCOiner()
    if(evoCoin >= Int(pointsToPurchase)!){
        print("Transaction Successful")
        performSegue(withIdentifier: "proceedQuestion", sender: self)
    }
    else{
        showToast(controller: self, message: "Insufficient EvoCoins", seconds: 0.5)
    }       
}

func showToast(controller: UIViewController, message : String, seconds: Double) {
    let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
    alert.view.backgroundColor = UIColor.black
    alert.view.alpha = 0.6
    alert.view.layer.cornerRadius = 15

    controller.present(alert, animated: true)

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds) {
        alert.dismiss(animated: true)
    }
}

func evoCoiner(){
    
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "EvoCoins")
    request.returnsObjectsAsFaults = false
    do{
        let result = try context.fetch(request)
        for data in result as! [NSManagedObject]
        {
            evoCoin = data.value(forKey: "evoCoins") as! Int
        }
    }catch{
        print("Failed")
    }
}    
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let detailController = segue.destination as! PopUpPurchaseViewController
        detailController.ppromo = promoCODE
        detailController.link = buyLink
        detailController.coinToPurchase = Int(pointsToPurchase)!
}
    
//This is the unwind used by the transaction back button
@IBAction func unwindToItem(segue: UIStoryboardSegue) {
}
}

这是事务VC中的代码

import UIKit
import AMTabView
import CoreData

class MarketplaceViewController: UIViewController, TabItem {

@IBOutlet weak var sView: UIView!

@IBOutlet weak var evoCoinLabe: UILabel!
    
 //For the sake of simplicity I only kept the Unwind functions    
  //MARK: - UNWIND FUNCTIONS
   @IBAction func unwindToMainMarketView(segue: UIStoryboardSegue) {
   }
   }

我该如何解决这个错误?

如果我的问题不清楚或措辞不正确,请告知(如果是这样,对不起,我对这一切都很陌生)

【问题讨论】:

  • 错误信息的哪一部分你不明白?你说的是let detailController = segue.destination as! PopUpPurchaseViewController,但它不是 PopUpPurchaseViewController,它是MarketplaceViewController。
  • 但是segue目的地是一个popUpVC
  • 检查故事板的接线
  • "但是 segue 目的地是 popUpVC" 不,不是。相信运行时,它比你知道的更多。

标签: swift xcode storyboard uistoryboardsegue unwind-segue


【解决方案1】:

正如@matt 在他的评论中已经说过并且错误明确指出的那样,您不能将MarketplaceViewController 转换为PopUpPurchaseViewController

此外,不要进行强制施法,而是始终寻找如下所示的安全施法。这样做可以防止崩溃。

if let detailController = segue.destination as? PopUpPurchaseViewController {
    ...
}
else { 
    // log failed to cast
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2019-05-30
    • 2020-10-01
    • 1970-01-01
    • 2019-11-20
    • 2014-07-18
    相关资源
    最近更新 更多