我正在尝试使用委托将数据从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/