iOS - 委托

  • 委托示例

    让我们假设一个对象 A 调用一个对象 B 来执行一个动作。一旦动作完成,对象 A 应该知道 B 已经完成了任务并采取必要的动作。这是在代表的帮助下实现的。
    上面例子中的关键概念是 -
    • A 是 B 的委托对象。
    • B 将有 A 的参考。
    • A 将实现 B 的委托方法。
    • B 将通过委托方法通知 A。
  • 创建委托的步骤

    步骤 1 − 首先,创建一个单视图应用程序。
    步骤 2 − 然后选择文件 → 新建 → 文件...
    iOS 教程
    步骤 3 − 然后选择Objective C Class 并单击Next。
    步骤 4 - 为类命名,例如,SampleProtocol,子类为 NSObject,如下所示。
    iOS 教程
    步骤 5 − 然后选择创建。
    步骤 6 − 在 SampleProtocol.h 文件中添加一个协议,更新后的代码如下:
    
    #import <Foundation/Foundation.h>
    // Protocol definition starts here 
    @protocol SampleProtocolDelegate <NSObject>
    @required
    - (void) processCompleted;
    @end
    // Protocol Definition ends here
    @interface SampleProtocol : NSObject {
       // Delegate to respond back
       id <SampleProtocolDelegate> _delegate; 
    }
    @property (nonatomic,strong) id delegate;
    -(void)startSampleProcess; // Instance method
    @end
    
    步骤 7 − 通过更新 SampleProtocol.m 文件来实现实例方法,如下所示。
    
    #import "SampleProtocol.h"
    @implementation SampleProtocol
    -(void)startSampleProcess {
       [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate 
       selector:@selector(processCompleted) userInfo:nil repeats:NO];
    }
    @end
    
    步骤 8 − 通过将标签从对象库拖到 UIView 中,在 ViewController.xib 中添加一个 UILabel,如下所示。
    iOS 教程
    步骤 9 − 为标签创建一个IBOutlet 并将其命名为myLabel 并更新如下代码以采用ViewController.h 中的SampleProtocolDelegate。
    
    #import <UIKit/UIKit.h>
    #import "SampleProtocol.h"
    @interface ViewController : UIViewController<SampleProtocolDelegate> {
       IBOutlet UILabel *myLabel;
    }
    @end
    
    步骤 10实现委托方法,为 SampleProtocol 创建对象并调用 startSampleProcess 方法。更新后的 ViewController.m 文件如下 -
    
    #import "ViewController.h"
    @interface ViewController ()
    @end
    @implementation ViewController
    - (void)viewDidLoad {
       [super viewDidLoad];
       SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init];
       sampleProtocol.delegate = self;
       [myLabel setText:@"Processing..."];
       [sampleProtocol startSampleProcess];
       // Do any additional setup after loading the view, typically from a nib.
    }
    - (void)didReceiveMemoryWarning {
       [super didReceiveMemoryWarning];
       // Dispose of any resources that can be recreated.
    }
    #pragma mark - Sample protocol delegate
    -(void)processCompleted {
       [myLabel setText:@"Process Completed"];
    }
    @end
    
    步骤 11我们将看到如下输出。最初,标签显示“正在处理...”,一旦 SampleProtocol 对象调用委托方法,该标签就会更新。
    iOS 教程