在 swift 中使用延迟调用数组项 - 获取 UIResponder 错误

Posted

技术标签:

【中文标题】在 swift 中使用延迟调用数组项 - 获取 UIResponder 错误【英文标题】:call array items with a delay using in swift - get UIResponder error 【发布时间】: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) 【参考方案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.
   

【讨论】:

以上是关于在 swift 中使用延迟调用数组项 - 获取 UIResponder 错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 后台获取和延迟

Swift - 如何获取数组过滤项的索引

下拉菜单在第一页加载时出现延迟

获取数据后更新选项卡项徽章(Swift)

Swift Defer 延迟调用

swift 删除排序数组中的重复项