解除控制器后未调用委托

Posted

技术标签:

【中文标题】解除控制器后未调用委托【英文标题】:Delegate not called after dismissing controller 【发布时间】:2015-06-30 12:40:46 【问题描述】:

我有一个控制器 A 和一个 UIButton,单击它时我会显示一个新的控制器 B。但问题是控制器 B 首先嵌入了 NAV。所以最终我要介绍 UINavigationController。

现在控制器 B 中有一个 UIButton,控制器将在该 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"];
];

我已经在我的控制器 A 中实现了委托 .h

@interface ControllerA : UIViewController<SummaryViewWhatsNewDelegate>

.m of Controller A

#pragma mark -ControllerB Delegate
-(void)SummaryViewWhatsNew:(NSString *)title
    NSLog(@"Delegate Called");

在这种情况下,我知道我没有提供 delegate.self 部分,因为我展示的是 NAV 控制器而不是控制器 B

所以我在 viewDidLoad 和 Controller *B 中创建了一个对象,并将委托设置为 self。但它不起作用,并且永远不会调用委托

另一方面,如果我只展示没有导航的控制器 B,并且在展示之前我保留 b.delegate=self,它可以工作。

另一个替代品可以触发通知。但我想和代表一起工作。

那么有什么方法可以调用由导航嵌入的呈现视图控制器的委托。任何帮助将不胜感激。

【问题讨论】:

b.delegate=self 必须设置,否则我怀疑它会起作用。 在哪里.??如果我在 UINav 上制作要呈现的对象,我无法设置 b.delegate。请阅读我的最后一行。 您必须在调用控制器 B 的控制器中进行设置。 控制器 B 嵌入了 nav..你能更详细一点吗?谢谢 好吧@SrinivasanN 谢谢,我找到了解决方案并发布了 【参考方案1】:

嗯,我得到了答案 我们必须从 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];

它奏效了。

【讨论】:

以上是关于解除控制器后未调用委托的主要内容,如果未能解决你的问题,请参考以下文章

swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托

在模态视图被解除后,父视图控制器中是不是有一个委托被调用?

在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”

解除控制器委托方法不起作用

解除多个视图控制器的委托问题

UIPopoverController 委托未在解雇时被调用