解雇控制器后未调用代表
Delegate not called after dismissing controller
我有一个控制器 A 和一个 UIButton,点击它我会显示一个新的控制器 B。但问题是控制器 B 首先嵌入了 NAV。所以最终我要介绍 UINavigationController。
现在在控制器 B 中有一个 UIButton,控制器将在其上关闭,并且应该通过一些消息将委托传递给控制器 A
控制器 A UIButtonCode
- (IBAction)summaryButtonClick:(id)sender {
UIStoryboard* storyBoard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController* summaryVC=[storyBoard instantiateViewControllerWithIdentifier:@"SummaryNavVC"];
[self presentViewController:summaryVC animated:YES completion:nil];
summaryVC=nil;
}
现在控制器B
.h 文件
#import <UIKit/UIKit.h>
@protocol SummaryViewWhatsNewDelegate <NSObject>
@required
- (void) SummaryViewWhatsNew:(NSString*)title;
@end
@interface SummaryViewController :
UIViewController<UITableViewDataSource,UITableViewDelegate>
{
id <SummaryViewWhatsNewDelegate> _delegate;
}
@property (nonatomic,strong) id delegate;
@property (weak, nonatomic) IBOutlet UITableView *summaryTableView;
- (IBAction)closeSummaryView:(id)sender;
@end
.m
//Button Click
[self dismissViewControllerAnimated:YES completion:^{
[_delegate SummaryViewWhatsNew:@"Sales Triggers Filter"];
}];
我已经在我的Controller A中实现了delegate
.h
@interface ControllerA : UIViewController<SummaryViewWhatsNewDelegate>
.m 控制器 A
#pragma mark -ControllerB Delegate
-(void)SummaryViewWhatsNew:(NSString *)title{
NSLog(@"Delegate Called");
}
在这种情况下,我知道我没有提供 delegate.self 部分,因为我展示的是 NAV 控制器而不是控制器 B
所以我在 viewDidLoad 和 Controller *B 中创建了一个对象,并将委托设置为 self。但它不起作用并且永远不会调用委托
另一方面,如果我只显示没有导航的 Cntroller B,并且在显示之前我保留 b.delegate=self,它会起作用。
另一个替代方法是触发通知。但我想和代表一起工作。
那么有什么方法可以调用 由 Nav 嵌入的呈现视图控制器的委托。任何帮助将不胜感激。
好吧,我得到了答案
我们必须从 NAV
中获取 Controller 对象
在我做演示的地方,我只需要添加这些行就可以了
UIStoryboard* storyBoard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController* summaryVC=[storyBoard instantiateViewControllerWithIdentifier:@"SummaryNavVC"];
//Add These lines in order to get the object of Controller B.
// SummaryViewController is my Controller B
SummaryViewController* summary=[[summaryVC viewControllers] objectAtIndex:0];
summary.delegate=self;
[self presentViewController:summaryVC animated:YES completion:nil];
它奏效了。
我有一个控制器 A 和一个 UIButton,点击它我会显示一个新的控制器 B。但问题是控制器 B 首先嵌入了 NAV。所以最终我要介绍 UINavigationController。
现在在控制器 B 中有一个 UIButton,控制器将在其上关闭,并且应该通过一些消息将委托传递给控制器 A
控制器 A UIButtonCode
- (IBAction)summaryButtonClick:(id)sender {
UIStoryboard* storyBoard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController* summaryVC=[storyBoard instantiateViewControllerWithIdentifier:@"SummaryNavVC"];
[self presentViewController:summaryVC animated:YES completion:nil];
summaryVC=nil;
}
现在控制器B .h 文件
#import <UIKit/UIKit.h>
@protocol SummaryViewWhatsNewDelegate <NSObject>
@required
- (void) SummaryViewWhatsNew:(NSString*)title;
@end
@interface SummaryViewController :
UIViewController<UITableViewDataSource,UITableViewDelegate>
{
id <SummaryViewWhatsNewDelegate> _delegate;
}
@property (nonatomic,strong) id delegate;
@property (weak, nonatomic) IBOutlet UITableView *summaryTableView;
- (IBAction)closeSummaryView:(id)sender;
@end
.m
//Button Click
[self dismissViewControllerAnimated:YES completion:^{
[_delegate SummaryViewWhatsNew:@"Sales Triggers Filter"];
}];
我已经在我的Controller A中实现了delegate .h
@interface ControllerA : UIViewController<SummaryViewWhatsNewDelegate>
.m 控制器 A
#pragma mark -ControllerB Delegate
-(void)SummaryViewWhatsNew:(NSString *)title{
NSLog(@"Delegate Called");
}
在这种情况下,我知道我没有提供 delegate.self 部分,因为我展示的是 NAV 控制器而不是控制器 B
所以我在 viewDidLoad 和 Controller *B 中创建了一个对象,并将委托设置为 self。但它不起作用并且永远不会调用委托
另一方面,如果我只显示没有导航的 Cntroller B,并且在显示之前我保留 b.delegate=self,它会起作用。
另一个替代方法是触发通知。但我想和代表一起工作。
那么有什么方法可以调用 由 Nav 嵌入的呈现视图控制器的委托。任何帮助将不胜感激。
好吧,我得到了答案 我们必须从 NAV
中获取 Controller 对象在我做演示的地方,我只需要添加这些行就可以了
UIStoryboard* storyBoard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController* summaryVC=[storyBoard instantiateViewControllerWithIdentifier:@"SummaryNavVC"];
//Add These lines in order to get the object of Controller B.
// SummaryViewController is my Controller B
SummaryViewController* summary=[[summaryVC viewControllers] objectAtIndex:0];
summary.delegate=self;
[self presentViewController:summaryVC animated:YES completion:nil];
它奏效了。