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