performeguewithidentifier 在 IBAction 方法中不起作用

Posted

技术标签:

【中文标题】performeguewithidentifier 在 IBAction 方法中不起作用【英文标题】:performseguewithidentifier not working in IBAction method 【发布时间】:2014-06-21 04:42:01 【问题描述】:

我有一个故事板,在视图和以下代码之间有一个连接。由于某种原因,segue 没有被调用,我很肯定它被正确命名。我想知道它是否不起作用,因为它是在 IBAction 方法中还是什么。我很困惑,所以如果您有任何想法,请告诉我。谢谢。

-(IBAction)didPressSubmit:(id)sender

    NSString *idOfObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"idOfObject"];


    PFQuery *query = [PFQuery queryWithClassName:@"RequestsClass"];


    [query getObjectInBackgroundWithId:idOfObject block:^(PFObject *myObj, NSError *error) 

        myObj[@"hasResponded"] = @"has";
        myObj[@"answer"] = textField.text;
        [myObj saveInBackground];



    ];

        [self performSegueWithIdentifier:@"userDidRespond" sender:self];

也没有错误,只是没有任何反应。我在该行的正上方添加了一个 NSLog,称它为“即将执行 segue”,并且打印效果很好。所以我不确定。

我也收到此警告

Warning: A long-running Parse operation is being executed on the main thread. 
 Break on warnParseOperationOnMainThread() to debug

所以我可能需要 Deque 主线程或类似的东西?谢谢

【问题讨论】:

检查 segues 名称是否为 userDidRespond。这个方法被调用了吗?设置断点进行检查。 你能发布你的 prepareForSegue 方法吗?似乎问题就在那里。 你的 segue 在故事板中是如何连接的? 尝试在prepareForSegue 中添加NSLog(@"Segue: %@", segue.identifier);。您至少可以查看是否调用了 any segue。 你推送到另一个 ViewController 了吗? 【参考方案1】:

移动这一行:

[self performSegueWithIdentifier:@"userDidRespond" sender:self];

在块内。

像这样:

-(IBAction)didPressSubmit:(id)sender

NSString *idOfObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"idOfObject"];


PFQuery *query = [PFQuery queryWithClassName:@"RequestsClass"];


[query getObjectInBackgroundWithId:idOfObject block:^(PFObject *myObj, NSError *error) 

    myObj[@"hasResponded"] = @"has";
    myObj[@"answer"] = textField.text;
    [myObj saveInBackground];

    [self performSegueWithIdentifier:@"userDidRespond" sender:self];

];


我希望这能解决问题。

【讨论】:

我试过了,还是不行。没有错误或任何东西。只是没有执行segue。我已经用可能有用的警告之一更新了我的答案。谢谢!【参考方案2】:

您还可以通过以下代码从一个视图控制器导航到另一个视图控制器,而无需使用performSegueWithIdentifier 方法。

 UIStoryboard *story = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
 viewController *viewObj = [story instantiateViewControllerWithIdentifier:@"viewController"];

 [self.navigationController pushViewController:viewObj animated:YES];

为此,您必须在情节提要中将 storyboardID 作为“viewController”提供给 viewcontroller。通过这种方法,您还可以为下一个视图设置对象。

【讨论】:

这是有道理的,但是当我使用它时,它什么也没做。我已经更新了我的答案,包括我收到的可能有用的警告之一。谢谢! 是的,在您的代码中,一个块正在运行。所以它在线程中运行。所以制作一个方法并将这个推送视图控制器的代码放在那个方法中。然后在您的操作之后调用它。或在一段时间后调用。【参考方案3】:

您收到的 Parse 警告是不相关的,应该放在另一个问题中。它告诉您您正在尝试连接到主线程上的 Parse(可能是登录?)。您想在具有完成块的不同线程上异步执行此操作。

类似这样的:(在 SWIFT 中)

PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: 
        (user,error) in
        completion(error == nil)
    )

Parse 在 Objective-C 中也有很多示例。

【讨论】:

以上是关于performeguewithidentifier 在 IBAction 方法中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

performeguewithidentifier 在一个 viewDidLoad 中有效,但在另一个 viewDidLoad 中无效,使用“Show”segues

使用 iBeacons 执行 eguewithidentifier