我正在尝试使用委托将数据从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
。我在这里做错了什么?
答案 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控制器)