【问题标题】:call array items with a delay using in swift - get UIResponder error在 swift 中使用延迟调用数组项 - 获取 UIResponder 错误
【发布时间】:2016-05-03 19:48:02
【问题描述】:

四处搜索似乎并没有提供我立即理解的任何内容。

我正在尝试为一个会打印出 'DOS like' 语句的应用程序制作一个愚蠢的“old skool”加载屏幕。

我当前的代码看起来像这样,但我得到一个 UIResponder, UIApplicationDelegate 错误 - EXE_BAD_ACCESS

我已尝试将其复制到新项目等。仍然遇到相同的错误。

代码如下:

class ViewController: UIViewController {

    @IBOutlet weak var loadingLBL: UILabel!

    @IBOutlet weak var logoIMG: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //fades logo image in 
        logoIMG.alpha = 0
        UIView.animateWithDuration(5, animations: {
            self.logoIMG.alpha = 1;
        })

        //array for loading text

        var loading = ["Loading please wait.......\n", "Registry , OK!\n", `"Available ram, 256k\n", "BIOS Load... OK\n", "Welcome" ]`

        var i = 0
        var str: String = ""
        var timer = NSTimer()

        //delay function for loading array text

        func delayFunc() {
            str += "\(loading[i])\n"
            loadingLBL.text = str
            if i == loading.count - 1 {
                timer.invalidate()
            }
            i += 1
        }

        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector(delayFunc()), userInfo: nil, repeats: true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }   
}

正如我所提到的,我遇到了崩溃,我不知道自己做错了什么。

任何帮助将不胜感激。

【问题讨论】:

  • 要了解如何调试崩溃,请访问raywenderlich.com/10209/my-app-crashed-now-what-part-1
  • 在您了解如何调试后,使用有关崩溃的具体详细信息更新您的问题,包括完整的错误消息和实际导致错误的行。
  • 按照@rmaddy 的建议进行操作之后。我将首先从您的 viewDidLoad 中删除您的 timeristr 变量以及您的 delayFunc。所有这些都应该在类级别......另外,你的计时器选择器参数应该是#selector(ViewController.delayFunc)

标签: ios arrays swift nstimer uiresponder


【解决方案1】:

我认为你的问题是 delayFunc() 在 vi​​ewDidLoad 中,选择器在 viewController 中查找但找不到函数(因为它在 viewDidLoad 中)

编辑:我不是 100% 清楚为什么选择器在 viewDidLoad 中时找不到 delayFunc。如果您在另一个函数的主体中声明一个函数,则它的生命周期最多是其“父”函数的生命周期。因此,当您的计时器尝试调用 delayFunc 时,delayFunc 不再存在,因为 viewDidLoad 已完成运行。

试试:

var i = 0
var str: String = ""
var timer = NSTimer()

var loading = ["Loading please wait.......\n", "Registry , OK!\n", "Available ram, 256k\n", "BIOS Load... OK\n", "Welcome" ]

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    //fades logo image in 
    logoIMG.alpha = 0
    UIView.animateWithDuration(5, animations: {
        self.logoIMG.alpha = 1;
    })

    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "delayFunc", userInfo: nil, repeats: true)
}

func delayFunc() {
    str += "\(loading[i])\n"
    loadingLBL.text = str
    if i == loading.count - 1 {
        timer.invalidate()
    }
    i += 1
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多