ios - Segue 不会传递数据

标签 ios objective-c uiviewcontroller segue

所以我设置了从一个 UIViewController 到另一个(MenuViewController 到 AgendaViewController)的 segue,但是目标 UIViewController 上的变量仍然显示为 null,即使我在 segue 期间更新了它。

我在 segue 方法中做错了吗?

这是 MenuViewController 的代码,我试图从以下 View 继续:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"toAgenda"]){
    AgendaViewController *controller = (AgendaViewController *)segue.destinationViewController;

    // Load agenda url based on event's name
    PFQuery *event_query = [PFQuery queryWithClassName:@"Event"];
    [event_query whereKey:@"event_name" equalTo:event_name];
    [event_query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            for (PFObject *object in objects) {
                controller.agenda_url = (NSString*)[object objectForKey:@"event_agenda_url"];
                NSLog(@"%@", [object objectForKey:@"event_agenda_url"]);
            }
        } else {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
    }
}

这是我为目标 View Controller AgendaViewController 编写的代码:

#import "AgendaViewController.h"
#import "Parse/Parse.h"

@interface AgendaViewController ()

@end

@implementation AgendaViewController

@synthesize agenda_url;
@synthesize webView;

- (void)viewDidLoad
{
[super viewDidLoad];

// Load web view with agenda url, which was just retrieved
NSURL *url =[NSURL URLWithString:agenda_url];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
[webView loadRequest:request];

NSLog(@"Data recieved. Agenda_url = %@", agenda_url);
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) { }
return self;
}

@end

谢谢!

最佳答案

对我来说,它看起来像是空的,因为您正在第二个线程上分配agenda_url值。所以基本上 AgendaViewController viewdidload 方法是在执行 findObjectsInBackgroundWithBlock: 的完成 block 之前触发的。要解决此问题,您应该在主线程上分配agenda_url或在完成 block 中调用loadRequest:

 [event_query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        for (PFObject *object in objects) {
            controller.agenda_url = (NSString*)[object objectForKey:@"event_agenda_url"];
            NSLog(@"%@", [object objectForKey:@"event_agenda_url"]);
        }
        NSURL *url =[NSURL URLWithString:controller.agenda_url];
        NSURLRequest *request=[NSURLRequest requestWithURL:url];
        [controller.webView performSelectorOnMainThread:@selector(loadRequest:) withObject:request waitUntilDone:NO];
    } else {
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }
}];

刚刚编辑了上面的代码以在主线程上执行loadRequest。正如下面评论中所建议的,在后台线程上调用 UIKit 元素是不安全的。

关于ios - Segue 不会传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035456/

相关文章:

ios - 在设置 doesRelativeDateFormatting = YES 时,stringFromDate 返回 nil

iphone - 自定义登录 View 弹出窗口,如警报 View

objective-c - 如何从文件系统删除图像/文件?

ios - 是否可以更改核心数据关系的删除规则,仍然进行轻量级迁移?

objective-c - 在 FreeBSD 上使用 Objective-C 开发 Web 应用程序

swift - 从 Swift 4 中的 Popover Viewcontroller 实时更新 UIViewController

ios - Segue 到 UITableViewController 覆盖导航栏

html - 苹果应用商店角标(Badge)在移动设备上重定向至可疑广告,但在桌面设备上则不然

ios - 按顺序异步下载图片

ios - 并发队列问题 - iOS/Swift