使用委托协议传递数据

时间:2014-03-24 13:31:54

标签: ios objective-c delegates

我正在尝试使用委托将数据从viewA传递到viewB。我尝试使用委托的原因是viewB是一个滑出菜单 - 我正在使用SWRevealViewController库来执行此功能。但是,作为副作用,prepareForSegue未从viewA调用,因为它不属于viewB

所以代表们似乎是前进的方向。

问题是我的委托方法没有被调用。

viewB中 - 我添加了一个在平移手势发生时调用的方法 - 打开侧边菜单。

所以这就是我所做的:

viewA我宣布了协议:

@protocol firstViewControllerDelegate <NSObject>
(void)sendData:(NSString *)string;
@end

viewA

中声明如此
@property (nonatomic, assign) id <firstViewControllerDelegate> delegate;

然后在viewA

中的平移手势中
-void)panGestureStarted:(UIPanGestureRecognizer *)gesture{

if (gesture.state == UIGestureRecognizerStateBegan){

    NSString *dataToPass = @"Test sending data to second view";
    [self.delegate sendData:dataToPass];

}

然后在viewB

#import "viewAController.h"

符合协议

@interface BBFilterViewController : UIViewController < firstViewControllerDelegate>

然后在viewB.m

- (void)viewDidLoad{

[super viewDidLoad];


ViewAViewController *viewA = [[ViewAViewController alloc] init];
viewA.delegate = self;}



-(void)sendData:(NSString *)string{
NSLog(@"Data from viewA %@",string);}

问题出在viewB。方法:永远不会调用-(void)sendData:(NSString *)string。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

此代码:

ViewAViewController *viewA = [[ViewAViewController alloc] init];
viewA.delegate = self;

创建ViewAViewController的新实例,设置其delegate然后销毁它。您应该找到现有的实例并连接到该实例,而不是创建一个永远不会被使用的新实例(它的视图永远不会被显示)。

在这种情况下,这将使用滑动视图控制器来获取前视图控制器。

在这种情况下,委托可能不是最佳方法,因为关系听起来倒退。您实际上只是在寻找viewA将一些数据传递给viewB,并且在提供有关滑动控制器(已有)的信息时可以直接执行此操作。 viewA也不一定总是在同一个地方,而viewB是。

所以,只需获取viewB并直接向其发送消息:

ViewBViewController *viewB = (ViewBViewController *)[(UINavigationController *)self.revealviewControler.rightViewController topViewController]; 
[viewB ...];

(强制转换是必需的,因为这些方法返回超类指针,你需要调用子类特定的方法,这些方法适用于nav控制器和视图B控制器)