Swift:在更新Label时解除可选值时意外发现nil

时间:2016-02-27 10:31:38

标签: ios swift uilabel optional

我在modelviewcontroller中有一个UILabel。 我想要做的是在我的代码的某个点上更改其文本。问题是它在第一点工作并停止在第二点工作,抛出以下错误:

unexpectedly found nil while unwrapping an Optional value

我发现了同样错误的其他问题,但这些解决方案对我不起作用。也许我对选项做错了。

以下是我的模型视图控制器的代码:

import UIKit

class CheckInViewController: UIViewController {

@IBOutlet weak var test: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidAppear(animated: Bool) {
    print("Appeared")
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("scanViewController") as! ScanViewController

    test.text = "Here it works" // FIRST POINT WORKS AND CHANGES THE LABEL

    if let qrCode = vc.qrCode{ // vc.qrCode IS AN OPTIONAL

        qrRead(qrCode)
        vc.qrCode = nil
    }


}

func qrRead(qrCode: String) {

    print(qrCode)

    test.text = "Here it doesnt work" // HERE IT STOPS WORKING
}

1 个答案:

答案 0 :(得分:0)

您在将vc.qrCode传递给nil函数后直接将func qrRead(qrCode: String)设置为vc.qrCode = nil

删除此行:class Person { } var a:Person? = Person() if let some = a { print(unsafeAddressOf(some)) print(unsafeAddressOf(a!)) } 并检查错误是否仍然存在。

如果没有,我怀疑,其他地方没有变数。

记得使用if let,实际访问底层实例,而不是副本。

因此,当您将vc.qrCode设置为nil时,您还将qrCode设置为nil,当您尝试在qrRead函数中打印时会导致问题

示例:

0x0000000005011ed0

0x0000000005011ed0

打印:

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = false

  # Do not eager load code on boot.
  config.eager_load = false

  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = false

  # Print deprecation notices to the Rails logger.
  config.active_support.deprecation = :log

  # Raise an error on page load if there are pending migrations.
  config.active_record.migration_error = :page_load

  # Debug mode disables concatenation and preprocessing of assets.
  # This option may cause significant delays in view rendering with a large
  # number of complex assets.
  config.assets.debug = true

  # Asset digests allow you to set far-future HTTP expiration dates on all assets,
  # yet still be able to expire them through the digest params.
  config.assets.digest = true

  # Adds additional error checking when serving assets at runtime.
  # Checks for improperly declared sprockets dependencies.
  # Raises helpful error messages.
  config.assets.raise_runtime_errors = true

   Raises error for missing translations
   config.action_view.raise_on_missing_translations = true
end

这表明它们是内存中的相同实例。