Meu problema é que meu programa é compilado sem erros e, sempre que clico em um botão, ele gera o erro "Erro fatal: encontrado nulo inesperadamente ao desembrulhar implicitamente um valor opcional" na linha de código:
SubButton1Outlet.isEnabled = true
Estou tentando ativar um botão desativado no editor de storyboard. Certifiquei-me de que o IBOutlet estava conectado ao botão certo no storyboard, mas ainda está gerando o erro.
override func viewDidLoad() {
super.viewDidLoad()
CallMemory()
SubButton1Outlet.isEnabled = true
}
@IBAction func SubButton1(_ sender: Any) {
SubNumber = 1;
}
@IBOutlet weak var SubButton1Outlet: UIButton!
Aqui está toda a seção de código relacionada ao problema e algumas capturas de tela do Xcode. Projeto GitHub completo: https://github.com/DarkCat736/SubscriptionManager/
O que eu esperava:
- Cargas de programa
- SubButton1 fica habilitado
var SubNumber
está definido para valor1
- SubButton1 é clicado e outra cena é aberta
O que aconteceu:
- Cargas de programa
- SubButton1 fica habilitado
- SubButton1 é clicado
- O programa gera erro e para
O Interface Builder configura IBOutlets como "opcionais implicitamente desembrulhados", o que significa que se o link de saída for quebrado, seu código irá travar.
Seu
SubButton1Outlet
é um opcional implicitamente desembrulhado. (Observe o ponto de exclamação após o tipo.Por alguma razão essa saída é nula. Verifique o link no Interface Builder.
Se aparecer como conectado, você pode estar criando seu controlador de visualização de uma forma que não carrega as visualizações do storyboard. Você terá que nos mostrar como está instanciando e carregando seu controlador de visualização antes que possamos ajudar a diagnosticar isso.
Editar:
Eu olhei para o seu projeto.
Seu storyboard está uma bagunça.
Ele contém 6 cenas de controlador de visualização diferentes, cada uma das quais é uma instância da mesma classe "ViewController".
Não faça isso. Defina uma subclasse personalizada diferente de UIViewController para cada controlador de visualização em seu storyboard. Cada um deve ter saídas e ações para os botões e visualizações que aquele controlador de visualização gerencia.
Seu controlador de visualização raiz possui um botão intitulado "SubButton1" que possui uma sequência modal para sua
SuscriptionView
cena, que contém um controlador de visualização que também é da mesma classeViewController
. No entanto, aSuscriptionView
cena não inclui um botãoSubButton1Outlet
, portanto, nessa instância do seuViewController
, o IBOutlet é nulo. Assim, aoviewDidLoad
disparar, tenta executar a linhaNo entanto,
SubButton1Outlet1
nessa instância o seu ViewController é nulo, então seu aplicativo trava.Novamente, sua cena SuscriptionView deve conter sua própria subclasse personalizada de UIViewController. Vamos chamá-lo
SubscriptionViewController
. Quando você invoca o modal segue do seu controlador de visualização raiz para suaSuscriptionView
cena, ele invocará um tipo diferente de controlador de visualização, umSubscriptionViewController
. O viewDidLoad desse controlador de visualização terá um código exclusivo para esse controlador de visualização e esseviewDidLoad
método não tentará definir umSubButton1Outlet1
que não existe no arquivoSubscriptionViewController
.