未调用委托方法
Posted
技术标签:
【中文标题】未调用委托方法【英文标题】:Delegate method is not being called 【发布时间】:2015-12-03 18:34:37 【问题描述】:我确信这个问题已经被问过很多次,我看到了所有这些解决方案,但我无法弄清楚为什么我的委托方法没有被调用。
我有两个视图控制器,比如说 Viewcontroller1 和 ViewController2。我的 ViewController2 首先加载。我将 ViewController1 作为 SWRevealViewController 的一部分。当我单击 ViewController 上的按钮时,我想在 ViewController2 上运行该方法,但它没有这样做,
//在 ViewController 1.
@protocol Company ;
#import "ViewController2.h"
@protocol Company <NSObject>
@required -(void) companyChange : (NSString *) sample;
@end
@interface ViewController1 : UITableViewController<UIAlertViewDelegate>
@property (weak,nonatomic) id<Company> delegate;
@end
-(void) buttonClicked
[self.delegate companyChange:@"Hello"];
假设我想在 ViewController2 中打印 @"Hello"。
我需要导入 ViewController2 用于其他目的。
//在ViewController2中
#import "ViewController1.h"
extern NSString * const firstString ;
@interface ViewController2 : UIViewController <Company>
-(void) viewDidLoad
ViewController *vc1 = [[ViewController1 alloc]init];
vc1.delegate = self;
//这个方法永远不会被调用
- (void) companyChange:(NSString *)sample
NSLog(@"%@",sample);
//还有警告说公司协议没有定义。
//我已将 buttonClicked 方法连接到一个按钮,并且 ViewController1 是 SWRevealController 菜单。 我无法弄清楚代码有什么问题。
【问题讨论】:
在buttonClicked
中放置一个断点。遇到断点时self.delegate
的值是多少?
您在viewDidLoad
中创建的ViewController1
实例和设置代理的实例与您的应用程序中显示的实例不同。这是一个新实例,之后会立即被释放。
@PhillipMills 在 ViewController2 -(void) companyChange : (NSString *) 样本没有被调用,但 [self.delegate companyChange:@"Hello"] 被调用。
@dan 我该如何修复它?
@Rosh 我从你的问题中明白了这一点。设置断点时看到了什么?
【参考方案1】:
如果您使用的是 SWRevealViewController,则实际上不需要使用委托。如果您#import "SWRevealViewController.h",您可以使用便利函数revealViewController 来获取对SWRevealViewController 的引用。然后你可以这样说:
SWRevealViewController *myRevealViewController = [self revealViewController];
UIViewController *frontViewController = myRevealViewController.frontViewController;
frontViewController.text = @"Something I Want to Show on Screen";
或者
SWRevealViewController *myRevealViewController = [self revealViewController];
UIViewController *backViewController = myRevealViewController.backViewController;
backViewController.text = @"Something I Want to Show on Screen";
其中 text 是一个公共的 NSString 属性。
【讨论】:
以上是关于未调用委托方法的主要内容,如果未能解决你的问题,请参考以下文章
UIDocumentPickerViewController - 未调用委托方法