Segue 不会传递数据

Posted

技术标签:

【中文标题】Segue 不会传递数据【英文标题】:Segue Won't Pass Data 【发布时间】:2013-11-23 04:20:17 【问题描述】:

我试图在另一个名为 BillTrackerViewController 的视图控制器中将一个数组设置为位于主类 MainViewController 中的名为 billtrackertablevalues 的 NSMutableArray 的值。我打算将 BillTrackerViewController 中的数组用作那里的 UITableView 的数据。但是,当我尝试设置该数组、table_items 和 segue 的值时,该表不显示任何内容。但是,billtrackertablevalues 的值是正确填充的,并且不为空。

这是我的 MainViewController 代码:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    if([segue.identifier isEqualToString:@"toBillTracker"]) 
        PFQuery *query = [PFQuery queryWithClassName:@"Resolution"];
        [query whereKey:@"event" equalTo:event_name_label.text];
        [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 
            if (!error) 
                for (PFObject *object in objects) 
                    [billtrackertablevalues addObject:[NSString stringWithFormat:@"%@\nPro: %@\nCon: %@\nResult: %@",[object objectForKey:@"resolution_name"], [object objectForKey:@"resolution_pro_speaker"], [object objectForKey:@"resolution_con_speaker"], [object objectForKey:@"resolution_result_id"]]];
                
                NSLog(@"%@", billtrackertablevalues);
                BillTrackerViewController *controller=(BillTrackerViewController *)segue.destinationViewController;
                controller.table_items = [[NSMutableArray alloc] init];
                controller.table_items = billtrackertablevalues;
             else 
                NSLog(@"Error: %@ %@", error, [error userInfo]);
            
        ]; 
    

这是我的 BillTrackerViewController 代码:

#import "BillTrackerViewController.h"
#import "Parse/Parse.h"

@interface BillTrackerViewController ()

@end

@implementation BillTrackerViewController

@synthesize billView;
@synthesize refreshButton;

@synthesize table_items;

- (void)viewDidLoad

    [super viewDidLoad];
    [billView reloadData];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)  
    return self;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return [table_items count];


- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];

    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
    

    NSString *cellText = table_items[indexPath.row];
    cell.textLabel.text = cellText;
    return cell;


@end

再一次,BillTrackerViewController 上的表没有加载值,但我的初始数组 billtrackertablevalues 已被填充。

提前谢谢各位!

【问题讨论】:

你不应该两次发布同样的问题。我已经在你的第一篇文章中回答了这个问题。 【参考方案1】:

更改以下代码:-

controller.table_items = [[NSMutableArray alloc] init];
controller.table_items = billtrackertablevalues;

如下:-

controller.table_items = [[NSMutableArray alloc] initWithArray:billtrackertablevalues];

之后在 viewDidLoad 方法中的 BillTrackerViewController 处执行 NSLog 并让我知道。希望它会起作用。

【讨论】:

在 viewDidLoad 方法中将 NSLog 放入 BillTrackerViewController 后,它返回“(null)”,即使 MainViewController 中的 billtrackertablevalues 数组已填充。但是,来自 BillTrackerViewController 的日志出现在 billtrackertablevalues 数组的日志之前,这可能表明这两个方法的执行存在时间问题。 @user2520999 嗯,这会导致计时问题,因为您在此处以块方法设置数组。您必须先执行 PFQuery 块方法,然后您必须执行Segue 方法。

以上是关于Segue 不会传递数据的主要内容,如果未能解决你的问题,请参考以下文章

通过 Segue 传递数据和一些错误

准备 segue 传递数据 nil

将数据从模态 segue 传递给父级

与 segue 一起传递数据

AppDelegate segue 替代传递数据

通过 navigationController 使用 segue 传递数据