Поток 1: EXC_BAD_ACCESS (код=2, адрес=0x16f2dbfd0) что означает этот код>

#ios #swift #class #inheritance #error-handling

Вопрос:

Я пытаюсь создать переменную, содержащую класс из другого контроллера представления, но эта ошибка появляется после запуска моего приложения в var char = Characters() строке. Код работает, если я выполнил весь код в одном контроллере представления, но я пытаюсь создать инструкцию switch (очень длинную) на другом контроллере представления, а затем просто вызываю инструкцию switch всякий раз, когда мне это нужно, на основном контроллере представления. мой код от обоих viewcontrollers выглядит следующим образом

 class ProgressBrain: UIViewController {
  
    var char = Characters()
    var level = 0
    var toNextLevel = 1
    var xpGained = 0.1
    
    func nenuLeveling() {
        var nenuProgress = char.nenuProgress.progress
        var nenuLevel = char.nenuLevel.text
        
        switch nenuLevel {
        case "1":
            nenuProgress = 0.0
            
            toNextLevel  = 3
            nenuLevel = "2"
        case "2":
            
            xpGained = 1
            toNextLevel  = 3
            nenuLevel = "3"
        case "3":
           
            xpGained = 1
            toNextLevel  = 3
            nenuLevel = "4"
        default:
            print("Something went wrong")
        }
    }
   
}

class Characters: UIViewController {

    
    var pb = ProgressBrain()
    var toNextLevel = 10
    var xpGained = 1
    var nenuEx = 1
    var nenuSurvival = 5
   
    
    
    @IBOutlet var nenuProgress: UIProgressView!
    @IBOutlet var remfoProgress: UIProgressView!
    @IBOutlet var oneiroProgress: UIProgressView!
    
   
    @IBOutlet var nenuLevel: UILabel!
    
    @IBOutlet var nenuTab: UITabBarItem!
    @IBOutlet weak var selector: UISegmentedControl!
    @IBOutlet weak var characterImg: UIImageView!
    
    @IBOutlet var routine: UIView!
    var views: [UIView]!
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
       
    }

  
    
    @IBAction func progressButton(_ sender: UIButton) {
      nenuProgressButton()
    }
    
   
    func nenuProgressButton() {
   
       
        
        let percentageProgress = Float(xpGained) / Float(toNextLevel)
        
        if xpGained < toNextLevel   1{
    
        
        nenuProgress.progress = Float(percentageProgress)
        print(Float(percentageProgress))
        
          xpGained  = 1
            
    } else if xpGained == toNextLevel   1 {
     
        pb.nenuLeveling()
     
        nenuProgress.progress = 0.0
        xpGained -= toNextLevel
        
       
    }
}
 

Комментарии:

1. var char = Characters() var char = Characters.init() это означает , что вы не предоставляете XIB или раскадровку, связанную с его инициализацией. Таким образом, весь ваш IBOutlet будет равен нулю. То же самое для var pb = ProgressBrain() . И это новые экземпляры, новые объекты, а не тот, который вы видите на экране( я думаю).

2. У вас также есть Characters создание экземпляра нового ProgressBrain и ProgressBrain создание экземпляра нового Characters , и в конечном итоге вы получите бесконечную рекурсию, когда каждый экземпляр будет повторно создавать другой. Чтобы предложить исправление, вам необходимо описать в общих чертах взаимосвязь между этими двумя контроллерами представлений и их соответствующими иерархиями представлений. Является ли один из них дочерним контроллером представления другого, причем оба видны одновременно? Представляет ли одно другое другое?

3. (В стороне, мы обычно даем нашим классам контроллеров представлений имена, указывающие на то, что они действительно являются контроллерами представлений, чтобы было проще рассуждать о нашем коде. Например, ProgressBrainViewController и CharactersViewController .)

4. Общие сведения см. в разделах Понимание типов исключений в отчете о сбоях , Расследование сбоев доступа к памяти , Определение причины распространенных сбоев и т.д. Но, как сказал Ларм, проблема в том, что Characters экземпляр не был создан из раскадровки, и поэтому @IBOutlet s не подключается.

5. Можете ли вы опубликовать изображения, которые показывают, чего вы хотите достичь?