我正在开发一个使用oauth 2.0与谷歌文档连接的应用程序,一旦用户连接,他点击一个按钮进入tableView以显示所有文档。为此,我使用segue并向前传递数据。现在我希望用户选择一个文档,对其进行勾选并返回到viewcontroller传回数据并显示选择的文档。我读到,为了传回数据,我需要使用协议和委托。我遵循了这个:Passing Data between View Controllers但我的问题是我的委托方法没有被调用。
这是我的故事板,只有2个视图,一个viewcontroller和一个名为VistaTableViewController
的tablaviewvcontroller。
当用户按下身份验证按钮时,他使用oauth连接谷歌文档。当他按下“Listar”按钮时,VistaTableViewController出现。
这是VistaTableViewController.h的代码,其中定义了协议:
#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的代码,我在其中调用委托方法:
#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
好的,现在我只需告诉ViewController导入VistaTableViewController并符合其协议。
这是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
然后在Viewcontroller.m中我按如下方式实现委托方法:(我只想显示一个警告,显示已选择的de文档的标题)。
- (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];
}
}
好的,所以我得到de tableView显示所有文档,用户可以选择一个显示de checkmark但是没有调用delegate方法,所以它不返回viewcontroller视图,也没有数据被传回。
我错过了什么?谢谢!
答案 0 :(得分:0)
当您编写VistaTableViewController *vistatableview = [[VistaTableViewController alloc] init];
时,您正在创建一个新对象。您真正想要做的是使用segue.destinationViewController
,VistaTableViewController
并将 委托设置为self
。
原样,具有委托的对象不是被推送的对象并且处理视图逻辑。
(另外,setMDocListFeed2
不返回对象,因此performSelector
上的作业具有误导性。)