未调用委托方法

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 - 未调用委托方法

未调用 TextField 委托方法

未调用 SWTableViewCell 委托方法

未调用委托方法

AVAudioPlayer 和 AVAudioRecorder:未调用委托方法

UITextView 委托未获得所有方法调用