比如在A页面设置B的delegate为A的实例,
// A.m中某处
B* b = [B alloc] init];
b.delegate = self;
[self.view addSubview:b];
[b release];
那么
1.是A负责创建B的,A的生命周期一定比B要长(B存在,A一定也存在;A存在,B不一定存在)
也就是说 在B(实例b)存在的时候,A(的实例)一定存在, 所以没有必要用retain将引用计数+1,assign足以
2.退一步假设存在这样的情况:A比B先挂掉(A的实例先被release销毁)
那么当然希望是[a relase]后,A中的方法不再被B调用,但是使用retain时候,A还是没有被销毁,所以 A中的方法仍会被B调用,但是assgin就无此问题
3.本质上delegate就是一根指向先于它存在的某个类(CCClass)的指针(假设是:ccPoint),我们通过delegate这根指针去指向这个已经存在的指针(ccPoint) 那么通过delegate即ccPoint也就可以访问CCClass中的实例方法
http://www.testin.cn/portal.action?op=Portal.index
用tabpanel的童鞋可能发现 用setrecord()后tabpanel里面的textfield无法有值,而非tabpanel的结构却没问题
tabpanel->panel->textfield 这种架构死活读不出来值
尝试了好几种方法
包括
1. 重构applyItems方法,不成功
applyItems:function (items, collection) {
var i = 0,
iNum = items.length,
record = this.getRecord(),
data = this.getData();
for (; i < iNum; i++) {
items[i].data = data;
}
return this.callParent([items, collection]);
}
2. 读取所有items然后自己setData() setRecord()
不成功
3. 得到所有二级panel,然后setData() setRecord() 也不成功
哥们弄了一晚上
最后想到了
4 , 直接读取所有fields然后赋值
开始居然自己写了一个递归函数来getItems()所有的值,不成功
后来发现有query()函数,救星
实现代码如下
var reqFields = this.query('field[xtype=textfield]');
console.dir(reqFields);
var i = 0, ln = reqFields.length,field;
for (; i < ln; i++) {
field = record.get( reqFields[i].getItemId());
reqFields[i].setValue(field);
}