返回列表 回复 发帖
支持!!!!

【01-12】 [翻译]Project:Omega cocoa教程4 - NSTableView 和 Dock Menu

原网址:http://www.projectomega.org/arti ... tuts_cocoa4&p=1
, q! S% d# l0 a- `1 }, q1 a( f2 j* k
cocoa教程4 - NSTableView 和 Dock Menu% E/ {0 N* m1 D+ A; r" N( T

- i9 J6 z. y5 w0 s7 p) k. u介绍
# {' S# p3 Q% S- `' z' [: ]) c
5 w; j; q: N8 W这个教程的目的是介绍两个新概念 : tables 表格 和 dock menu 底栏菜单.
5 K, _& L7 t6 X
. U" t& I- @9 q, h为什么同时介绍两个不同的控件? 因为我想在这个系列教程结束前讲些足够分量的内容, 并且一个太短的教程不是个好方法来展示一个应用程序是如何工作的.
5 D0 t) m/ i$ [5 `' e% K
# ]4 e/ J9 s8 ^( [) \! y5 n  o第一部分将介绍如何在一个应用程序里使用 NSTableView 表格物件. 第二部分在此基础上增加 dock menu.
- l0 f2 d7 ?; J8 ?4 u' X2 }4 g
7 k# v, ~. c# G; y- E. e; CNSTableView* k( q' {; p3 T

0 _1 p' ?  K% k& C! V( J- 启动 Xcode. O8 s! H6 A, a: g" U8 @! T* ?& Z
  k1 y9 J, h9 n  t
- 创建一个新的 project ("Cocoa Application"); E- `4 o: h* X' g+ C6 U) t9 `
1 S+ a. Z* G/ B! {- I; e5 v# G
- 取名 " PODock"
, _, B  m% u& Y( z1 f3 q* \2 j
2 ~! w* c- Q2 c! U8 l; q- 双击 Resources 组别里的 "MainMenu.nib" 用 Interface builder 打开它
& Z  C2 u: `0 K; D% R) b 0 [5 `; w( n0 N. H' w. E
- 在 Library 面板里拖动一个 NSObject 到 MainMenu.nib 窗口. 在Identity Inspector里将Class命名为" PODock". 由于未知的原因, 在MainMenu.nib 窗口里显示的是Dock.
  O# Q( N, y  m- }) h4 K$ f& [
5 N& }5 m' o4 ^% {& W% B跟前面的教程一样, 先在Xcode里建立新文件 PODock.h 和 PODock.m.6 @  r" `% y: M& q/ `
再回到 Interface builder 里, 选PODock, 然后 write class file 替换刚刚建立的两个文件.
( j( f$ f4 T7 W0 B/ c+ r( v/ Z& c
- 打开 Interface builder 里面的窗口, 按下图添加控件.
: |8 f& q7 A2 X" C* H9 i% D, z9 f一个只有一列的表格 (NSTableView), 默认是两列, 可以在Attributes Inspector 里面设置, 并在窗口里将第一列拉长为整个表格.6 Y* C/ Y/ x5 y% \  x4 A$ l
一个文本编辑框 (NSTextField), 和一个 "增加"按钮 (NSButton). 在窗口 Window 的Attributes Inspector 里去掉 Close 前面的勾, 这样程序会简单一点.
$ a$ k: d3 U) v* L; ]! R. h! i1 T) }: u  Z9 ]# B, k/ X" w
- 回到Xcode, 按下面修改 PODock.h 文件
  1. #import <Cocoa/Cocoa.h>

  2. @interface PODock : NSObject
  3. {
  4.     IBOutlet NSTextField *                editfield;
  5.     IBOutlet NSTableView *                table;

  6.     NSMutableArray *                         comments;
  7. }

  8. - (IBAction) addCommentAction:(id)sender;

  9. @end
复制代码
这里展示了如何直接在代码文件里添加 outlets 和 action 以及其他变量.
2 O3 o7 N6 H) X) A7 S我们添加了:
/ k6 A4 Z' a" F' A& U4 e  F8 W0 M. y 0 S& i; `  v7 P# [. Y  |3 `+ _9 \
- 两个 outlets 用来连接界面里的两个控件, 表格和文本框
+ L; U" [2 @( b  l8 N/ ]7 f- A
# |1 ^: P4 L4 b1 ?, s- 一个 mutable array 变量数组, 用来存储用户输入的注释
* g) J. O! f& d: N
; A& v( ]1 c' i& O- 一个 action 对应点击 "增加" 按钮所触发的事情
& R0 ?3 ^: c# c3 d3 z# z 2 W3 Q: w+ v$ i2 b: H
- 保存PODock.h, 回到 Interface builder 里, 可以发现 PODock 控制器已经自动更新, 具有了刚才创建的两个 outlets 和一个 action
* ?6 X( a! I: v1 e4 r7 ~+ A. E* _  g/ J
- Ctrl+鼠标拖动从 PODock 到文本框, 选择 editfield.0 p2 F% ^. C$ o4 ^* P3 Z& J
- Ctrl+鼠标拖动从 "增加" 按钮到 PODock , 选择 addCommentAction.& ?/ j' D1 j  F
- 双击表格激活 NSTableView, Ctrl+鼠标拖动连接 "datasource" and "delegate" 到 PODock./ X9 @, z$ c5 A% \
- 连接 PODock 的 "table" outlet 到窗口的 NSTableView.
6 a5 V- T6 I( j% L: Y6 P* r1 T. i4 h' E5 W& l

$ N: Z% ?. i& R" o) Y[ 本帖最后由 sweec 于 2008-1-12 05:38 编辑 ]
附件: 您所在的用户组无法下载或查看附件
1

评分次数

  • suplp

cocoa教程4 - NSTableView 和 Dock Menu (继续)
- Y- s2 ~, l+ e8 P! r  @. V- O5 I+ Y) e! G0 _
NSTableView (继续)3 d' K, ^6 p. ^6 F2 h$ k! D/ t: @

( C: A$ Y# X  C7 M. x9 I- 现在回到Xcode继续改写 PODock.m
  1. #import "PODock.h"

  2. @implementation PODock

  3. // ******************************************

  4. // 这个 message 方法, 会在启动时被调用, 在这里:
  5. //    - 初始化注释数组
  6. //    - 并为它添加一个新注释

  7. - (void) awakeFromNib
  8. {
  9.     comments = [[NSMutableArray alloc] initWithCapacity:30];
  10.     [comments addObject:@"这是一个注释"];
  11. }

  12. // 这个 message 方法, 在退出时调用, 在这里:
  13. // 释放注释数组

  14. - (void)applicationWillTerminate:(NSNotification *)notification
  15. {
  16.     [comments release];
  17. }


  18. // ******************************************

  19. // 这个 message 方法, 在用户点击 "添加" 按钮, 或者 dock menu 的 "添加一个注释" 时调用
  20. //   全靠在 InterfaceBuilder 中的连接
  21. //   这里添加文本框里的注释到数组里
  22. //   然后在屏幕上刷新表格

  23. - (IBAction) addCommentAction:(id)sender
  24. {
  25.     [comments addObject:[editfield stringValue]];
  26.     [table reloadData];
  27. }


  28. // ******************************************
  29. // TABLE DATA SOURCE
  30. // ******************************************
  31. // 这个 message 方法, 在每次显示表格时将被自动调用

  32. - (int)numberOfRowsInTableView:(NSTableView*)table
  33. {
  34.     // 返回注释的数目
  35.     return [comments count];
  36. }


  37. // 这个 message 方法, 在每次显示表格时将被自动调用

  38. - (id)tableView:(NSTableView*)table objectValueForTableColumn:(NSTableColumn*)col
  39. row:(int)rowIndex
  40. {
  41.     // let's return the comment at the specified row index
  42.     return [comments objectAtIndex:rowIndex];
  43. }


  44. // 这个 message 方法, 当用户双击表格的一行时调用

  45. - (void)tableView:(NSTableView*)table
  46.    setObjectValue:(id)object
  47.    forTableColumn:(NSTableColumn*)col
  48.               row:(int)rowIndex
  49. {
  50.     // 注释已被更改, 改变数组里相应的值
  51.     [comments replaceObjectAtIndex:rowIndex withObject:object];
  52. }

  53. @end
复制代码
- 现在点击 "Build and Run" 按钮测试这个应用程序.
) N* c# ?- C, Q4 @. q3 s: T
8 ^* k$ H* _) d# @0 l8 ]1 |+ Q" s
[ 本帖最后由 sweec 于 2008-1-12 07:52 编辑 ]
附件: 您所在的用户组无法下载或查看附件
cocoa教程4 - NSTableView 和 Dock Menu (继续)1 h9 S- A3 U& p3 U8 w6 Q5 [

4 E6 z* Y/ ]) G0 A- FDock Menu 底栏菜单
- {7 E7 _0 n  J) U' l+ I$ i. t$ d; ]+ f
- 在 Interface Builder 里, 从 Library 面板的 Application 资源里拖出一个 NSMenu 到 MainMenu.nib 窗口.
7 B3 a2 D# W6 o, B8 X) t3 m. u+ M 6 E5 d! s* h* V( H: c$ n
- 双击打开并按下面的样子编辑 NSMenu, 并将前两个菜单项的 Attributes Inspector 里的 " enabled" 状态 state 前面的勾去掉, 这样显示时这两项将为灰色不可选
1 z5 k- _3 A- D( s  `; E+ o+ N% |
- 连接 NSMenu 的"添加新注释" 菜单项到 PODock 的 "addCommentAction"+ v7 U5 W. _) L5 v, {

3 a$ K% P0 V$ }2 T2 X* g) U- 连接 "File's Owner" 到刚生成的 NSMenu, 选择 "Dock menu" 这个 outlet, 这样底栏菜单将采用这个 NSMenu., v6 n. q- V2 N% X; B2 \

' M1 y& ^, b( h3 M- 连接 "File's Owner" 到 PODock, 选择 "delegate" 这个 outlet. 这样将告诉 PODock 控制类何时发生了右键点击应用程序的底栏菜单事件.
- S# v. s+ F. ?8 N5 p
, ~$ {* w0 C0 R& k6 }) m  ~- 现在回到 Xcode 在 PODock.h 里添加一个 Outlet: myDockMenu
  1. #import <Cocoa/Cocoa.h>

  2. @interface PODock : NSObject
  3. {
  4.     IBOutlet NSTextField *                editfield;
  5.     IBOutlet NSTableView *                table;
  6.     IBOutlet NSMenu *                myDockMenu;

  7.     NSMutableArray *                         comments;
  8. }

  9. - (IBAction) addCommentAction:(id)sender;

  10. @end
复制代码
保存文件, 再回到 Interface builder , 连接 PODock 到新生成的 NSMenu, 选择 myDockMenu, 便于控制这个菜单.  k3 w2 L  P9 B, J- D- i
# d5 D4 ~, x+ j3 v  v
- 下面这个最重要的, 用来处理每次 底栏菜单 dock menu 的显示内容.
  1. - (NSMenu *)applicationDockMenu:(NSApplication *)sender
  2. {
  3.     NSMenuItem * item;

  4.     // 显示注释个数
  5.     item = [myDockMenu itemAtIndex:0];
  6.     [item setTitle:[NSString stringWithFormat:@"%d个注释",[comments count]]];

  7.     // 显示选中的注释
  8.     item = [myDockMenu itemAtIndex:1];
  9.     if ([table selectedRow]>=0)
  10.         [item setTitle:[comments objectAtIndex:[table selectedRow]]];
  11.     else
  12.         [item setTitle:@"没有选定的注释"];
  13.         
  14.     return myDockMenu;
  15. }
复制代码
- 编译并执行 PODock. 这样就好了 !3 B/ q7 V$ ]% G/ E% E6 ]' j
4 U* ?/ o2 h, T4 V) [& h
5 _* ~' i) x8 R3 l8 H
[ 本帖最后由 sweec 于 2008-1-12 07:59 编辑 ]
附件: 您所在的用户组无法下载或查看附件
1

评分次数

  • 麦客孤独

不错,支持,继续发,楼主
这篇文章可以加精呀!SWEEC兄弟,辛苦了!
这个文章堪称极品,赞哪!!!!
3.0的要学学,感觉3.0晕晕的
太好了,多谢Lz, ,辛苦了
真是太好了。坚决支持的说。。。。感谢感谢呀。。。
返回列表