我正在尝试使用委托将数据从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 .m方法中:从未调用-(void)sendData:(NSString *)string。我在这里做错了什么?

最佳答案

这段代码:

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控制器)

关于ios - 使用委托(delegate)协议(protocol)转发数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22610884/

10-13 02:53