作者zonble (zonble)
看板MacDev
标题Re: [问题] Obj-C中的delegate如何运作?
时间Sat May 30 01:28:58 2009
※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
: ※ 引述《leondemon (狗狗)》之铭言:
: 所以在 Cocoa 程式里你不太会去弄一堆 subclass 继承来继承去
: 而是会建立一个又一个的 helper object, 来辅佐已有的 class 做到更多事
: 大概是这样...
呃,真的要在不用 subclass 就扩充某个 class,用 category
可能会比较好?
其实应该这麽说,delegate 物件的意义,在於某个 class 做某
件事情的时候,在某个状况其实是应该询问你应该怎麽做的时候
,你回答他应该怎麽做,或是当他做了某件事情的时候,顺便告诉
你,「因为我现在做了这件事情,你应该趁这个时候,另外做一
件你觉得你应该也要做的事情。」
如果是用 UI 这一层要使用,其实可以这麽想-在 Cocoa 里头的
事件(NSEvent),其实是不多的,而且几乎所有的 GUI 物件,
都是处理同一套 Event,就滑鼠事件来说,就只有 Mouse down、
Mouse up、Mouse move 等等,如果只是一个单纯的按钮,可能还
够用,毕竟只有点下去一个事件而已,但是如果是像 NSTableView
,就不够用了,因为点到某一列、某一栏、点到内容或是标题列、
是选取或是编辑某一个 cell,都是不同的行为。
如果你写过 .Net 的 GUI,就可以看到,微软在处理这种状况的时
候,就会是所有不同的 UI 物件,可以处理不同数量的 event,
然後去处理什麽 onClick()、onMove() 之类的。但是就 Cocoa 的
想法,则是,不管是点到哪里,都是一个 Mouse Down,然後,
NSTableView 在处理了这个滑鼠事件之後,再透过 delegate 物件
,询问这个时候应该做什麽。
所以像是 .Net 的话,table 被点到,你可能这样写-
m_myTable.click += self.myMethod(); // 先随便写
Cocoa 里头大概就会是
[_myTable setDelegate:self];
然後实作
- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex;
之类的。因为当你把 delegate 指定到某个物件,然後,在 table
被点到的时候,这个时候他自己不能做决定到底应不应该把某个 row
选起来,所以就需要一个代理人,问:可以选吗?你就在回应这个
问题地方,告诉 table view 应不应该选。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.182.67
1F:推 leondemon:没用过.Net 但是经你叙述 有比较懂一点 05/31 01:17
2F:推 leondemon:不过有稍微了解到delegate实际怎麽运作的 感恩~ 05/31 02:42