在单独的文件(而不是ViewController中)中定义委托函数

问题描述:

我有一个ViewController和一个UIView。 UIView有一个委托,并在ViewController中设置委托函数。在单独的文件(而不是ViewController中)中定义委托函数

我想要做的就是在单独的文件中定义委托函数。所以UIView.m#输入单独的文件,而不是使用UIView的所有ViewController。

我相信这是一个标准程序,但不断下降,试图让它工作。 :|真的很感谢一些帮助。谢谢。

myViewController.h

#import <UIKit/UIKit.h> 
#import "myUIView.h" 
@protocol ModalViewDelegate      
-(void)didReceiveMessage:(NSString *)message; 
@end 
@interface myViewController : UIViewController <ModalViewDelegate> 
@property (nonatomic, strong) myUIView *myUIViewItem; 
@end 

myViewController.m

#import "myViewController.h" 
#import "myUIView.h" 
@interface myViewController() 
@end 
@implementation myViewController 

@synthesize myUIViewItem; 
- (void)didReceiveMessage:(NSString *)message { //<<< THIS IS WHAT 
    NSLog(@"Message from button: %@", message); //<<< NEEDS MOVING 
} 
- (void)viewDidLoad 
{ 
… 
myUIViewItem.delegate = self; 
… 

myUIView.h

#import <UIKit/UIKit.h> 
@protocol ModalViewDelegate; 
@interface myUIView : UIView { 
    id<ModalViewDelegate> delegate; 
} 
@property (nonatomic, strong) id<ModalViewDelegate> delegate; 

myUIView.m

#import "myUIView.h" 
#import "myViewController.h" 
@implementation myUIView 
@synthesize delegate; 
... 
[delegate didReceiveMessage:@"Data from UIView!"]; 
+0

你在做的方式看起来不错,你的问题是什么? – Charan

+0

您是否想要在myUIView.m文件中实现'didReceiveMessage'函数.. – AppleDelegate

+0

我想要在SEPARATE文件中定义函数'didReceiveMessage'。所以我不必在每个使用UIView和委托的ViewController中重复它。例如ModalViewDelegate_Action.h和ModalViewDelegate_Action.m –

基于您的评论:

我希望有功能 'didReceiveMessage' 在一个单独的 文件中定义。所以我不必在每个使用UIView和委托的ViewController中重复它。例如ModalViewDelegate_Action.h和 ModalViewDelegate_Action.m

我给出的方法是使用一个子类,而对于我来说,这是伟大的工作。在我的iOS项目中,我有一个名为BaseViewController的类,它是UIViewController的一个子类。我在其中涉及到HUD管理,NSOperations管理等等很多代码。然后几乎所有的视图控制器都是它的子类。

+0

感谢您的建议。如果我无法得到sree的建议,我可能会研究它。但我认为不建议子类化子类? –

+2

你完全错了 - 你可以继续继承子类来继承超类的行为。在我的应用程序中,我有4个UIViewController子类 - BaseClass,一个表控制器类,然后是一个Pull-To-Refresh类(后者使我可以轻松地在多个地方采用PullToRefresh)。 –

+0

4天后..非常感谢伟大的建议David H. Sree的解决方案最终没有帮助,但你的建议最有用。 –

好,有一个方法实际上,

就拿一个.h文件中,并让说connectionDelegate.h,并宣布对协议的init

在connectionDelegate.h:

 #import <UIKit/UIKit.h> 
    @protocol ConnectionDelegate 
    -(void)getResult:(NSString*)_result; 
    @end 

然后在您的视图控制器中:

#import "ConnectionDelegate.h" 

@interface myViewController : UIViewController <ConnectionDelegate> 
{ 
id delegate; 
} 

然后在.m文件,仅通过调用该方法

[delegate getResult:_result]; 

编辑有关的警告:

您需要申报视图控制器的方法,你需要做这样的。

[self getResult:urlDataString]; 

-(void)getResult:(NSString*)_result{ 
    [delegate getResult:_result]; 
} 
+0

在ViewController.m中我收到这些错误:!方法'getResult:'在协议中没有实现 !不完整的实现任何想法我没有实现? –

+0

你有没有为委托人声明财产? @属性(非原子,保留)ID委托; – Charan

+0

不,你需要声明它在viewController.h文件 – Charan