2013-11-22 3 views
0

Я пытаюсь установить массив в другом контроллере представления, названном BillTrackerViewController, на значения NSMutableArray, называемые значениями billtrackertablevalues, расположенными в основном классе MainViewController. Я намерен использовать массив в BillTrackerViewController в качестве данных для UITableView. Однако, когда я пытаюсь установить значение этого массива, table_items и segue, таблица ничего не показывает. Однако значение billtrackertablevalues ​​правильно заполнено и НЕ равно нулю.Segue не будет передавать данные в TableView

Вот мой код 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); 

     } else { 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
    }]; 

    BillTrackerViewController *controller=(BillTrackerViewController *)segue.destinationViewController; 
    controller.table_items = [[NSMutableArray alloc] init]; 
    controller.table_items = billtrackertablevalues; 
} 
} 

И вот мой код 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, заполняется.

Заранее спасибо, ребята!

+0

Проверьте значение billtrackertablevalues ​​непосредственно перед последней строкой в ​​prepareForSegue. Я думаю, что это временная проблема - метод, findObjectsInBackgroundWithBlock: может быть возвращен непосредственно перед выполнением блочного кода. Кроме того, эта строка, controller.table_items = [[NSMutableArray alloc] init] ;, бесполезна и должна быть удалена. – rdelmar

+0

См. Ответ здесь: http://stackoverflow.com/a/20158584/952440 Может быть, это будет полезно. –

ответ

0

Я думаю, вам нужно переместить строки инстанцирования контроллера, и установив его свойство внутри блочного метода:

-(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 = billtrackertablevalues; 

     } else { 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
     }]; 
    } 
} 

После Edit:

Существует еще вопрос времени, поскольку в Segue происходит до того, как возвращается блок, поэтому вы должны переопределить setter для table_items в BillTrackerViewController. Переход все равно будет происходить первый (вы можете поставить счетчик на ваш взгляд, так что пользователь знает, что что-то происходит), а затем, когда блок отделки, сеттер будет называться:

-(void)setTable_items:(NSString *)table_items { 
    _table_items = table_items; 
    //update your table here. 
} 
+0

все еще не работает - есть ли что-то, что мне нужно сделать на другом контроллере? – LordChiu

+0

@ user2520999, в журнале все еще отображаются правильные значения для billtrackertablevalues? Пробовали ли вы контроллер регистрации, а также controller.table_items (в prepareForSegue)? Если нет, сделайте это и сообщите о результатах. – rdelmar

+0

журнал вернул следующее: ( «Решено, что вы есть то, что едите. \ NПроект: Райан Чиу \ nКон: Солнечный шах \ nРезультат: Прошел", "Решено, что современная технология создала" Меня, Меня " , Me \ ". \ NPro: Райан Чиу \ nКон: Райан Чиу \ nРезультат: Сбой" ) – LordChiu

0

Как об этом:

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

Также проблема может быть в BillTrackerViewController сам

Смежные вопросы