Please have a look at the screenshot of my project for better understanding 我在堆栈溢出和其他有关编写自定义委托的网站中浏览了很多内容。但在我的情况下,代表没有被调用。从屏幕截图中可以看出,初始视图控制器有一个按钮,按钮可以调用标签栏。从第一个Tab栏屏幕,假设我想将数据传回初始视图控制器,我该怎么办?我甚至可以使用NSUserDefaults,但我想以正确的方式编码。所以我开始知道委托是将数据从一个控制器传回前一个控制器的最佳方式。但是因为我在中间使用标签栏,所以代表没有被调用..请帮助,
以下是代码, 我希望数据从第一个标签传递到初始控制器。
TabScreenController.h:
@protocol TabScreenControllerDelegate <NSObject>
-(void)someFunction:(NSString*)someValue;
@end
@interface TabScreenController : UIViewController
@property (nonatomic, weak) id <TabScreenControllerDelegate> delegate;
@end
InitialViewController.h:
@interface InitialViewController : UIViewController<TabScreenControllerDelegate>
InitialViewController.m:
TabScreenController* controller = [[TabScreenController alloc]init];
[controller setDelegate:self];
//The delegate is not getting called
-(void)someFunction:(NSString *)someValue{
NSLog(@"%@", someValue);
}
没有调用委托,也许InitialViewController.m中的TabScreenController与单击选项卡时创建的实例不同。
请帮我解决这个问题..我该如何处理这种情况。如果我没有说清楚,请告诉我。
谢谢
答案 0 :(得分:0)
错误在于您没有将代理设置为现有 TabScreenController
,而是实例化新的TabScreenController
并设置代理。使用TabBarController
时,所有childViewControllers
都已实例化。
在您的情况下,您需要查找TabScreenController
,然后设置其委托。
NSArray* tabChildViewControllers = tabBarController.viewControllers;
for (UIViewController * childVC in tabChildViewControllers) {
if ([childVC isKindOfClass:[TabScreenController class]]) {
// set your the delegate
}
}