黑马程序员技术交流社区

标题: 【分享】我的第一个Mac程序——倒计时v1&v2 [打印本页]

作者: zzyyzz1992    时间: 2015-3-9 17:17
标题: 【分享】我的第一个Mac程序——倒计时v1&v2
本帖最后由 zzyyzz1992 于 2015-3-9 17:24 编辑

先放效果图:

这是我第一次尝试在Mac平台下编程,之前学过几天IOS开发,一直在等MJ老师更新。闲下来不编程不舒服,给自己,也给老婆编了这个以提醒自己好好学习。v2版加入了各种倒计时。改进了界面。把倒计时计算抽成了一个类,提高程序的复用性。-概览

首先放上xib界面图


-改界面名字

建项目的过程中一开始不小心取了个没有远见的名字“考研倒计时”,后来改成了倒计时。怎么改呢?我是这样改的:(比如程序的window,上面的menuitem类同)

顺手把Resize的钩钩去掉

把Full Screen改成Primary Window蛮有意思的。(试试把Resize勾上再全屏)


-拖入控件

这里我一开始只拖进去这5句话(NSTextField),双击控件先把文字改个样子做个效果。在右边顺便把字体改了。

后来如图又加入了一个NSImageView 以作背景

在Attribute Inspector中改成我事先找好的图,并把Scaling改成AxesIndependently 这样图片就可以适当的放缩了。


-代码&优化

一开始我的代码是这样的,后来又加了纪念日、软考等,代码是直接“拷贝”复用的。

  1. #pragma mark - 设置 -
  2. NSDateComponents *components=[[NSDateComponents alloc]init];//创建组件
  3. #pragma mark 考研
  4. [components setMonth:1];
  5. [components setDay:4];
  6. [components setYear:2015];
  7. [components setHour:7];
  8. NSDate *targetDate = [[NSCalendar currentCalendar] dateFromComponents:components];
  9. NSTimeInterval targetInteval = [targetDate timeIntervalSinceNow];
  10. // NSLog(@"%f",KYinteval);
  11. NSLog(@"%d",(int)targetInteval/60/60/24);
  12. [_KYLabel setStringValue:[NSString stringWithFormat:@"距离考研还有%d天!",(int)targetInteval/60/60/24]];
复制代码



v2版把倒计时计算抽成了一个类,提高程序的复用性。

用法如下:(使用了Delegate思想和静态实例化思想)

  1. ZZYDateCounter*dc=[ZZYDateCounter CounterWithTargetYear:2015mounth:1day:4hour:7andSentence:@"距离考研还有%d天!"];
  2.     dc.textDelegate=_KYLabel;
  3.     [dc say];
复制代码

ZZYDateCounter源代码如下:(提供了使用NSDate初始化和直接使用年月日小时直接初始化的两个接口,为以后的扩展预留接口)
  1. //
  2. //  ZZYDateCounter.h
  3. //  考研倒计时
  4. //
  5. //  Created by 张泽阳 on 3/14/14.
  6. //  Copyright (c) 2014 张泽阳. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface ZZYDateCounter : NSObject
  10. @property NSTextField* textDelegate;
  11. -(void)say;
  12. +(ZZYDateCounter*)CounterWithTargetDate:(NSDate*)targetDate andTargetSentence:(NSString*)targetSentence;
  13. +(ZZYDateCounter*)CounterWithTargetYear:(int)y mounth:(int)m day:(int)d hour:(int)h andSentence:(NSString*)targetSentence;
  14. @end
  15. //
  16. //  ZZYDateCounter.m
  17. //  考研倒计时
  18. //
  19. //  Created by 张泽阳 on 3/14/14.
  20. //  Copyright (c) 2014 张泽阳. All rights reserved.
  21. //
  22. #import "ZZYDateCounter.h"
  23. @implementation ZZYDateCounter{
  24.     NSDateComponents *components;
  25.     NSString* counterSentence;
  26.     NSTimeInterval targetInteval;
  27.     NSDate *targetDate ;
  28.     }
  29. -(id)init{
  30.     if (self=[super init]) {
  31.         components=[[NSDateComponentsalloc]init];//创建组件
  32.     }
  33.     returnself;
  34. }
  35. -(id)initWithDate:(NSDate*)date andSentence:(NSString*)sentence{
  36.     if ((self=self.init)) {
  37. //        form http://blog.sina.com.cn/s/blog_8732f19301010fxd.html
  38. //        NSDate 相互转换
  39. //        
  40. //        NSDateComponents *comps = [[NSDateComponents alloc] init];
  41. //        
  42. //        [comps setDay:6];
  43. //        
  44. //        [comps setMonth:5];
  45. //        
  46. //        [comps setYear:2004];
  47. //        
  48. //        NSCalendar *gregorian = [[NSCalendar alloc]
  49. //                                 
  50. //                                 initWithCalendarIdentifier:NSGregorianCalendar];
  51. //        
  52. //        NSDate *date = [gregorian dateFromComponents:comps];
  53. //        
  54. //        [comps release];
  55. //        
  56. //        NSDateComponents *weekdayComponents =
  57. //        
  58. //        [gregorian components:NSWeekdayCalendarUnit fromDate:date];
  59. //        
  60. //        int weekday = [weekdayComponents weekday];
  61.         NSCalendar *gregorian = [[NSCalendar alloc]
  62.                                 initWithCalendarIdentifier:NSGregorianCalendar];
  63.         components=[gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit |NSHourCalendarUnitfromDate:date];
  64.         counterSentence=[NSString stringWithString:sentence];
  65.             } ;
  66.     returnself;
  67. }
  68. -(void)say{
  69.     targetDate = [[NSCalendarcurrentCalendar] dateFromComponents:components];
  70.     targetInteval = [targetDatetimeIntervalSinceNow];
  71.     if (targetInteval<0) {
  72.         targetInteval=-targetInteval;
  73.     }
  74.     [_textDelegatesetStringValue:[NSStringstringWithFormat:counterSentence,(int)targetInteval/60/60/24]];
  75. }
  76. -(id)initWithYear:(int)y mounth:(int)m day:(int)d hour:(int)hour andSentence:(NSString*)sentence{
  77.      if ((self=self.init)) {
  78.          [components setMonth:m];
  79.              [components setDay:d];
  80.             [components setYear:y];
  81.          [components setHour:hour];
  82.           counterSentence=[NSString stringWithString:sentence];
  83.      }
  84.     returnself;
  85. }
  86. +(ZZYDateCounter *)CounterWithTargetDate:(NSDate *)targetDate andTargetSentence:(NSString *)targetSentence{
  87.         ZZYDateCounter* counter = [[ZZYDateCounteralloc] init];
  88.     return [counter initWithDate:targetDate andSentence:targetSentence];
  89. }
  90. +(ZZYDateCounter*)CounterWithTargetYear:(int)y mounth:(int)m day:(int)d hour:(int)h andSentence:(NSString *)targetSentence{
  91.     ZZYDateCounter* counter = [[ZZYDateCounteralloc] init];
  92.     return [counter initWithYear:y mounth:m day:d hour:h andSentence:targetSentence];
  93.      }
  94. @end
复制代码





作者: zzyyzz1992    时间: 2015-3-9 17:18
本帖最后由 zzyyzz1992 于 2015-3-9 17:26 编辑

在AppDelegate中添加下面两个方法:

  1. //关闭Window后退出程序
  2. -(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender{
  3.     NSLog(@"ttt");
  4.     returnYES;
  5. }
  6. //当然少不了彩蛋了!
  7. - (IBAction)onAboutClicked:(NSMenuItem *)sender {
  8.     NSAlert *alert = [NSAlertalertWithMessageText:@"关于这个软件"defaultButton:@"我也爱你" alternateButton:nilotherButton:nilinformativeTextWithFormat:@"为我家亲爱的编写,祝我们都能考上好研究生,一辈子在一起!\n永远爱我家文儿!"];
  9.     [alert beginSheetModalForWindow:_windowcompletionHandler:nil];

  10. }
复制代码



最后,别忘了

设置为开机自启:)



心得体会:
Mac下开发果然特别舒服,和IOS一脉相承。了解了NSImageView和NSTextView和NSWindow 等控件。

计划以后继续深入了解如:

改变部分字体颜色和文字大小、

改进NSWindow的外观、

使用快捷键进出全屏

等。

2014.3.14日成文

作者: Micro    时间: 2015-3-9 17:22
你是一个大神。被我发现了。。。。这里帖代码,要用<>来帖,再改改。。。
作者: zzyyzz1992    时间: 2015-3-9 17:23
Micro 发表于 2015-3-9 17:22
你是一个大神。被我发现了。。。。这里帖代码,要用来帖,再改改。。。

嗯嗯,正在改




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2