2013-11-22 7 views
0

MainViewController 메인 클래스에있는 billtrackertablevalues라는 NSMutableArray 값에 BillTrackerViewController라는 다른 뷰 컨트롤러의 배열을 설정하려고합니다. 나는 BillTrackerViewController의 배열을 UITableView의 데이터로 사용하려고한다. 그러나 해당 배열 table_items 및 segue의 값을 설정하려고하면 테이블에 아무 것도 표시되지 않습니다. 그러나 billtrackertablevalues의 값은 올바르게 채워지고 null이 아닙니다. 여기 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 내 코드입니다 : 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 

,하지만 내 초기 배열 , billtrackertablevalues가 채워집니다.

미리 감사드립니다.

-(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]); 
     } 
     }]; 
    } 
} 

편집 후 :

여전히 SEGUE 타이밍 문제 때문에이

+0

에있을 수 있습니다. 이것은 타이밍 문제라고 생각합니다. findObjectsInBackgroundWithBlock : 메소드는 블록 코드가 실행되기 바로 전에 반환 될 수 있습니다. 또한이 줄, controller.table_items = [[NSMutableArray alloc] init];은 쓸모가 없으므로 제거해야합니다. – rdelmar

+0

답변을 참조하십시오 : http://stackoverflow.com/a/20158584/952440 도움이 될 수 있습니다. –

답변

0

난 당신이 선이 컨트롤러를 인스턴스화하고, 블록 방법 내부에 그 속성을 설정 이동할 필요가 있다고 생각 블록이 반환되기 전에 발생하므로 BillTrackerViewController의 table_items에 대한 setter를 재정의해야합니다. SEGUE는 여전히 발생합니다 먼저 블록 마감이, 세터를 호출 할 때 다음 (당신이 사용자가 뭔가가 일어나고있는 알 수 있도록보기에 스피너를 넣을 수 있음) :

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

여전히 작동하지 않습니다 - 다른보기 컨트롤러에서해야 할 일이 있습니까? – LordChiu

+0

@ user2520999, 로그에 여전히 billtrackertablevalues에 대한 올바른 값이 표시됩니까? 컨트롤러와 로깅을 시도 했습니까 (prepareForSegue에서) controller.table_items? 그렇지 않으면 결과를보고하십시오. – rdelmar

+0

로그가 다음을 반환했습니다. ( "해결했습니다. 먹은 음식입니다. \ nPro : Ryan Chiu \ nCon : Sunny Shah \ n 결과 : 합격 됨", "해결되었으므로 현대 기술로 \"Me, Me , Me \ "세대 : \ nPro : Ryan Chiu \ nCon : Ryan Chiu \ n 결과 : 실패" ) – LordChiu

0

이 방법에 대해 :

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

또한 문제는 prepareForSegue에서 마지막 행 앞에 billtrackertablevalues의 값을 확인 BillTrackerViewController 자체

관련 문제