8、协议Delegate代理模式-OC

代理协议在iphone开发中用了很多,几乎每个项目中都有用到。

代理和被代理端,怎么进行数据交互。

(1)协议的具体用法

(2)如何实现代理

(3)代理2端如何通讯


事件方法由人来实现;狗中存放有人的类;

这里将信息汇报给主人;

定时器:狗每个1秒向人汇报。(初始化狗的时候就开始定时发送数据)

.m

timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:selfselector:

@selector(updataTimer:) userInfo:nilrepeats:YES];

意思是:[self updateTimer:nil];

- (void) updataTimer:(id)arg

{

barkCount ++;

//通知狗的主人

[delegatebark:self count:barkCount];

}

//这个函数在人中

- (void) bark:(Dog *)thisDog count:(int)count

{


}

不让main函数退出:

while(1)

{

[[NSRunloopcurrentRunLoop] run];

}


存放狗的主人:

id delegate;//ownner 狗的主人

在人调用setDog方法时将,主人id存放进去。


定义一个人和狗通信的协议:

在狗中定义一个协议

@protocol DogBark <NSOject>

- (void) bark:(Dog *)thisDog Count:(int)count;

@end

id<DogBark> delegate;//ownner 狗的主人


在人中实现这个协议


狗的声明和协议的声明:

@class Dog;//表示前向声明

@protocol DogBark;//协议前向声明



(1)协议的具体用法[事件通知;c语音中叫:回调指针]

(2)如何实现代理

(3)代理2端如何通讯


定义协议

//
//  Dog.h
//  DogAndPerson
//
//  Created by ccy on 13-12-21.
//  Copyright (c) 2013年 ccy. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DogToPerson.h"

@interface Dog : NSObject <DogToPerson>
{
    int _dogID;
    id _delegate;//人的类
    int barkCount;
    NSTimer * timer;
}
@property int dogID;
@property (retain) id delegate;

@end

Dog调用协议:

//
//  DogToPerson.h
//  DogAndPerson
//
//  Created by ccy on 13-12-21.
//  Copyright (c) 2013年 ccy. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"
@class Dog;//这里一定要记得声明

@protocol DogToPerson <NSObject>
@optional
- (void) dogBark:(Dog *) thisDog barkCount:(int) barkCount;

@end

//
//  Dog.m
//  DogAndPerson
//
//  Created by ccy on 13-12-21.
//  Copyright (c) 2013年 ccy. All rights reserved.
//

#import "Dog.h"

@implementation Dog

@synthesize dogID = _dogID;
@synthesize delegate = _delegate;

- (id)init
{
    self = [super init];
    if (self) {
        self.dogID = 0;
        barkCount = 0;
        timer = [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(hand:) userInfo:nil repeats:YES];
    }
    return self;
}

- (void)hand:(id)arg
{
    NSLog(@"dog hand\n");
    barkCount++;
    [self.delegate dogBark:self barkCount:barkCount];
}

@end

person申明协议:

//
//  Person.h
//  DogAndPerson
//
//  Created by ccy on 13-12-21.
//  Copyright (c) 2013年 ccy. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject<DogToPerson>
{
    Dog * _dog;
}
@property (retain) Dog * dog;


@end

//
//  Person.m
//  DogAndPerson
//
//  Created by ccy on 13-12-21.
//  Copyright (c) 2013年 ccy. All rights reserved.
//

#import "Person.h"

@implementation Person
@synthesize dog = _dog;

- (void)dogBark:(Dog *)thisDog barkCount:(int)barkCount
{
    NSLog(@"dogBark thisDogID:%d, barkCount:%d\n", thisDog.dogID, barkCount);
}

@end

main 执行程序

//
//  main.m
//  DogAndPerson
//
//  Created by ccy on 13-12-21.
//  Copyright (c) 2013年 ccy. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        // insert code here...
        NSLog(@"Hello, World!");
        
        Person * xiaoLi = [[Person alloc] init];
        Dog * dog1 = [[Dog alloc] init];
        dog1.dogID = 1024;
        dog1.delegate = xiaoLi;
        
        xiaoLi.dog = dog1;
        
        [dog1 release];
        
        while (1)
        {
            [[NSRunLoop currentRunLoop] run];
        }
        [xiaoLi release];
    }
    return 0;
}

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt Model/View/Delegate 是 Qt 提供的一种用于实现 MVC 设计模式的框架,其中 Model 负责存储数据,View 负责显示数据,Delegate 负责定制数据的显示方式。 在 Model 中,我们可以通过实现 `roleNames()` 函数来定义数据的角色名称。这些角色名称可以被 View 和 Delegate 使用来访问 Model 中的数据。 `roleNames()` 函数返回一个 `QHash<int, QByteArray>` 类型的值,其中键是角色的编号,值是角色的名称。对于一个标准的 Model,Qt 提供了一些已经定义好的角色,例如 `Qt::DisplayRole` 用于显示数据,`Qt::EditRole` 用于编辑数据等。 我们也可以自定义角色,例如在一个存储学生信息的 Model 中,我们可以自定义一个 `Qt::UserRole` 角色,用于存储学生的分数信息。在 `roleNames()` 中,我们可以这样定义: ```cpp QHash<int, QByteArray> StudentModel::roleNames() const { QHash<int, QByteArray> roles; roles[Qt::DisplayRole] = "display"; roles[Qt::UserRole] = "score"; return roles; } ``` 在 View 中,我们可以使用 `data()` 函数来访问 Model 中的数据,同时指定要访问的角色。例如: ```cpp QVariant score = model->data(modelIndex, Qt::UserRole); ``` 在 Delegate 中,我们可以重写 `setModelData()` 函数来更新 Model 中的数据,同时指定要更新的角色。例如: ```cpp void ScoreDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); QString score = lineEdit->text(); model->setData(index, score, Qt::UserRole); } ``` 通过定义和使用自定义角色,我们可以更加灵活地操作 Model 中的数据,并将数据以更加自然的方式展示给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值