【问题标题】:Segue won't perform when activated without a button xcode Swift 2没有按钮xcode Swift 2激活时Segue不会执行
【发布时间】:2016-04-26 20:54:14
【问题描述】:

我正在尝试制作一个 IOS 应用程序并检查用户是否已登录。当用户未登录时,它应该显示一个登录表单。我创建了多个视图控制器并将它们与 segue 连接起来。比我使用self.performSegueWithIdentifier("userLoggedOff", sender: self) 来激活segue。但是出现了错误EXC_BAD_ACCESS

但是,当我尝试使用链接到按钮的相同代码激活相同的 segue 时,一切正常。真令人沮丧...谢谢您的帮助。

这是完整的代码。我使用 JSON 来获取用户的帐户信息。这可能不是这样做的方法,但我是 xcode、swift 和应用程序制作的初学者。

import UIKit
import WebKit

class StartController: UIViewController {

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

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

    func checkLoginStatus_main(){
        let requestURL: NSURL = NSURL(string: "https://www.example.net/account/accountinfo.php")!
        let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithRequest(urlRequest) {
            (data, response, error) -> Void in


            let httpResponse = response as! NSHTTPURLResponse
            let statusCode = httpResponse.statusCode

            if (statusCode == 200) {

                do{

                    let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)

                    if let accounts = json["account"] as? [[String: AnyObject]] {

                        for account in accounts {

                            if let status = account["status"] as? String {

                                if let name = account["name"] as? String {
                                    if(status == "true"){
                                        print("LoggedIn") // THIS WORKS
                                        self.continueScanner()

                                    } else {
                                        print("LoggedOut") // THIS WORKS
                                        self.continueLoginForm()
                                    }
                                }

                            }
                        }

                    }

                }catch {
                    print("Error with Json: \(error)")
                }

            }

        }
        task.resume()
    }

    func continueLoginForm(){
        self.performSegueWithIdentifier("userLoggedOff", sender: self)
    }

    func continueScanner(){
        self.performSegueWithIdentifier("userLoggedIn", sender: self)
    }
}

这是错误: Screenshot of the error

这是完整的输出:

LoggedOut
1   0x18771c654 <redacted>
2   0x1834bcfe4 <redacted>
3   0x1834b1e50 _os_once
4   0x1834ba728 pthread_once
5   0x1886a6d98 <redacted>
6   0x1886a6680 WebKitInitialize
7   0x188c4bfa0 <redacted>
8   0x100791a3c _dispatch_client_callout
9   0x1007928b4 dispatch_once_f
10  0x182ebcfc8 <redacted>
11  0x182ec38b8 <redacted>
12  0x182ecdd78 <redacted>
13  0x188f9c130 <redacted>
14  0x188f9c2cc <redacted>
15  0x188f9be9c <redacted>
16  0x188ca9ff4 <redacted>
17  0x188f9c154 <redacted>
18  0x188f9be9c <redacted>
19  0x188e780a0 <redacted>
20  0x188f9c154 <redacted>
21  0x188f9c2cc <redacted>
22  0x188f9be9c <redacted>
23  0x188e773d4 <redacted>
24  0x188d19140 <redacted>
25  0x188addfcc <redacted>
26  0x1889a07ec <redacted>
27  0x1889a0744 <redacted>
28  0x18928f504 <redacted>
29  0x188cfcca0 <redacted>
30  0x188d22a04 <redacted>
31  0x188d257a0 <redacted>

【问题讨论】:

  • 请发布完整的错误。应该不仅仅是EXC_BAD_ACCESS
  • 我添加了截图
  • 你尝试设置异常断点了吗?
  • @Lenny Xcode 控制台中应该有一个解释说明为什么你会得到 EXC_BAD_ACCESS。查看该信息并将该信息添加到您的帖子中。
  • 您应该转到断点面板并单击底部的小加号按钮。设置断点后,像往常一样运行您的项目,这可能会给您一个线索。 i.stack.imgur.com/BPe8N.png

标签: ios iphone xcode swift segue


【解决方案1】:

@Paulw11 解决了我帖子中 cmets 中的问题。

dispatch_async(dispatch_get_main_queue(), { self.performSegue...

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    我认为你可能需要实现 prepareForSegue

        override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
            if (segue.identifier == "userLoggedOff") {
                let vc = segue.destinationViewController as? LogInScreenViewController
            } else if (segue.identifier == "userLoggedIn") {
                let vc = segue.destinationViewController as? UserLoggedInViewController 
    //This should be the name of whatever view controller they go to if they are logged in.
        }
        }
    

    【讨论】:

    • 没用。 prepareForSegue 方法在 viewcontroller 实现中是可选的。
    • 感谢您的回答!不幸的是,它似乎并没有解决问题
    • 这不会有任何区别。您所做的只是将目标视图控制器不必要地加载到您不做任何事情的变量中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多