1

我是 iPhone 开发的新手,有一些基本问题要protocolsdelegates。我有两个视图控制器:视图控制器和 viewcontroller2nd。我在其中一个中有UITextField并想在其中输入一些内容(如名称),在 viewcontroller2nd 中,我有一个UILabel,我希望它在 UITextField 更改时显示你好,名称。

我正在关注这个视频:http ://www.youtube.com/watch?v=odk -rr_mzUo 让基本委托在单个视图控制器中工作。

我正在使用协议来实现这一点:

SampleDelegate.h

#import <Foundation/Foundation.h>

@protocol ProcessDelegate <UITextFieldDelegate>
@optional
- (BOOL)textFieldShouldReturn:(UITextField *)textField;
@end

@interface SampleDelegate : NSObject
{
    id <ProcessDelegate> delegate;
}

@property (retain) id delegate;

@end

SampleDelegate.m

#import "SampleDelegate.h"

@implementation SampleDelegate

@synthesize delegate;

- (BOOL)textFieldShouldReturn:(UITextField *)textField{

    lbl.text = [NSString stringWithFormat:@"Hello, %@",txtField.text];
    [txtField resignFirstResponder];

}

@end

视图控制器.h

#import <UIKit/UIKit.h>
#import "SampleDelegate.h"

@interface ViewController : UIViewController <ProcessDelegate>
{
    IBOutlet UITextField *txtField;
}

@end

视图控制器.m

#import "ViewController.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

ViewController2nd.h

#import <UIKit/UIKit.h>

@interface ViewController2nd : UIViewController <ProcessDelegate> {

    IBOutlet UILabel *lbl;
}



@end

ViewController2nd.m是来自 Xcode 的标准代码。

我的问题是如何将我的委托函数链接到我的 viewcontroller 和 viewcontroller2nd 以使其工作?

如果问题很愚蠢,请原谅我..需要一些指导。请指出我正在做的任何其他错误..谢谢..

4

1 回答 1

1

你的代表团有点……不。

首先:不要通过协议继承覆盖 UIKit 委托方法。这是毫无意义。为什么不首先让你的类符合指定的委托呢?

@protocol ProcessDelegate //No more protocol inheritance!
 //...
@end

其次:当一个对象定义了一个协议时,该对象的一个​​有效实例必须由其委托使用(或至少传递给它)。因此,任何想要成为(顺便说一下,对于classSampleDelegate来说确实是一个坏名字)的代表的东西都会初始化一个有效的对象,并像调用任何其他属性一样调用它。 SampleDelegate-setDelegate:

//#import "SampleDelegate"
@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //make this a property, so it isn't crushed when the function exits.
    SampleDelegate *myDelegateObject = [[SampleDelegate alloc]init];
    [myDelegateObject setDelegate:self];  //conform to the delegate
}

第三:您实际上并没有定义任何委托方法!如果没有什么可以委托的,那么委托有什么意义!l

@protocol ProcessDelegate 
 -(void)someMethod;
@end

第四,也是最重要的一点:永远,永远,永远,永远,永远不要在委托中使用retain, 或存储说明符!strong 委托对象应该是weakassign防止讨厌的保留周期。

@property (assign, nomatomic) id delegate;
于 2012-10-23T04:18:03.657 回答