2012-07-17 5 views
1

oauth 2.0을 사용하여 Google 문서와 연결하는 응용 프로그램에서 작업 중입니다. 사용자가 연결되면 tableView로 이동하여 모든 문서를 표시하는 버튼을 클릭합니다. 이를 위해 저는 segue를 사용하고 데이터를 전달합니다. 이제 사용자가 하나의 문서를 선택하고 체크 표시를하고 뷰 컨트롤러로 돌아와 데이터를 전달하고 문서가 선택되었음을 표시하기를 원합니다. 데이터를 다시 전달할 때 프로토콜과 대리자를 사용해야한다고 읽었습니다. 나는 이것을 따라 갔다 : Passing Data between View Controllers하지만 내 문제는 내 대리자 메서드가 호출되지 않습니다.데이터 다시 전달 : 대리인 메서드가 호출되지 않았습니다.

여기 내 스토리 보드입니다. 단지 두 개의보기, viewcontroller 및 tablaviewvcontroller는 VistaTableViewController입니다.

enter image description here

사용자 인증 용 버튼 푸시 그는의 OAuth를 사용하여 Google 워드 프로세서와 연결된다. "Listar"버튼을 누르면 VistaTableViewController가 나타납니다. 그래서

#import "VistaTableViewController.h" 


@implementation VistaTableViewController 
{ 
    NSInteger selectedIndex; 
} 

@synthesize delegate; 
@synthesize documento; 
@synthesize mDocListFeed2; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    selectedIndex = [[mDocListFeed2 entries] indexOfObject:self.documento]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [[mDocListFeed2 entries] count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tablalistar"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"tablalistar"]; 
    } 

    GDataEntrySpreadsheet *doc = [[mDocListFeed2 entries] objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [[doc title] stringValue]; 

    if (indexPath.row == selectedIndex) 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    else 
     cell.accessoryType = UITableViewCellAccessoryNone; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    if (selectedIndex != NSNotFound) 
    { 
     UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:selectedIndex inSection:0]]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    selectedIndex = indexPath.row; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

    cell.accessoryType = UITableViewCellAccessoryCheckmark; 

    GDataEntrySpreadsheet *doc = [[mDocListFeed2 entries] objectAtIndex:indexPath.row]; 

    NSString *theDoc = [[doc title] stringValue]; 

    [self.delegate loqueselecciono:self didSelectDoc:theDoc]; 
} 

@end 

확인 : 여기

#import <UIKit/UIKit.h> 
#import "GData.h" 


@class VistaTableViewController; 

@protocol VistaTableViewControllerDelegate <NSObject> 
- (void)loqueselecciono:(VistaTableViewController *)controller didSelectDoc:(NSString *)documento; 
@end 


@interface VistaTableViewController : UITableViewController <UITableViewDataSource> 
{ 
    IBOutlet UITableView *tablalistar; 
    GDataFeedDocList *mDocListFeed2; 
} 

@property (nonatomic, weak) id <VistaTableViewControllerDelegate> delegate; 
@property (nonatomic, strong) NSString *documento; 
@property (nonatomic, retain) GDataFeedDocList *mDocListFeed2; 

@end 

내가 대리자 메서드를 호출 VistaTableViewController.m의 코드이다 : 여기

은 프로토콜을 정의 VistaTableViewController.h의 코드 이제는 ViewController에게 VistaTableViewController를 가져오고 해당 프로토콜을 준수하도록 지시해야합니다. 다음과 같이 여기

내가 대리자 메서드를 구현 Viewcontroller.m에 ViewController.h

의 코드를 다음
#import <UIKit/UIKit.h> 
#import "GTMOAuth2ViewControllerTouch.h" 
#import "GData.h" 
#import "VistaTableViewController.h" 

@interface ViewController : UIViewController <VistaTableViewControllerDelegate> 

- (GDataServiceGoogleDocs *)docsService; 
- (void)authorize; 
- (void) mifetch; 
- (IBAction)autenticarse; 
- (IBAction)listar:(id)sender; 
- (void) ticket: (GDataServiceTicket *) ticket finishedWithFeed: (GDataFeedDocList *) feed error: (NSError *) error; 

@property (nonatomic, retain) NSString *accessToken; 
@property (nonatomic, retain) GDataFeedDocList *mDocListFeed; 
@property (nonatomic, retain) GDataServiceTicket *mDoclistFetchTicket; 


@end 

입니다 : (난 그냥 선택한 드 문서의 제목을 보여주는 경고를 표시 할) .

- (void)loqueselecciono:(VistaTableViewController *)controller didSelectDoc:(NSString *)documento; 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 

    UIAlertView *alertView = [ [UIAlertView alloc] initWithTitle:@"doc seleccionado" 
                 message:[NSString stringWithFormat:@"titulo: %@", documento] 
                 delegate:self 
               cancelButtonTitle:@"Dismiss" 
               otherButtonTitles:nil]; 

    [alertView show]; 
} 

그리고 Viewcontroller.m에서 나는 위임자에게 자신을 할당하기 위해이 글을 썼다.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Make sure your segue name in storyboard is the same as this line 
    if ([[segue identifier] isEqualToString:@"displaydocs"]) 
    { 
     VistaTableViewController *vistatableview = [[VistaTableViewController alloc] init]; 

     vistatableview.delegate = self; 

     vistatableview = [segue.destinationViewController performSelector:@selector(setMDocListFeed2:) withObject:mDocListFeed]; 
    } 
} 

좋아, 그래서 나는있는 tableView 모든 문서를 표시하고 사용자가 하나 보여주는 드 체크 표시를 선택할 수 있지만, 그것은의 ViewController보기로 반환하지 않도록 대리자 메서드가 호출되지 않는 및 데이터가 다시 전달되지 드 얻을 .

무엇이 부족합니까 ?? 감사!!

답변

0

VistaTableViewController *vistatableview = [[VistaTableViewController alloc] init];을 쓸 때 새 개체가 생성됩니다. 실제로 수행하고자하는 것은 segue.destinationViewController이며 VistaTableViewController이어야하며 에 대표자를 대표로 설정해야합니다.

마찬가지로 위임의 개체는 푸시되고 뷰 논리를 처리하는 개체가 아닙니다.

은 (performSelector에 할당 오히려 오해의 소지가 있으므로 또한, setMDocListFeed2는 객체를 반환하지 않습니다.)

+0

당신에게 정말 고마워요 !!!! 그것은 지금 일한다!! 당신은 setMDoclistFeed2에 대해 옳았습니다. – user1502091

관련 문제