写一个简单的todo list程序,界面如下图:

在TextField区域输入文字,点击Add按钮会将文字显示在下面的TableView列表中。TableView列表有2列,第一列是文字的输入时间;第二列是文字内容本身。同时TableView的第二列是可以实时手动编辑修改的,修改后自动会修正对应第一列的时间:

1.在AppDelegate类的接口中首先绑定2个outlet和1个action:

- (IBAction)add:(id)sender;
@property (weak) IBOutlet NSTableView *tableView;
@property (weak) IBOutlet NSTextField *textField;

2.绑定TableView的delegate和dataSource为AppDelegate本身:

3.最后代码补全如下:

AppDelegate.h

//
//  AppDelegate.h
//  TodoList
//
//  Created by kinds on 15/6/28.
//  Copyright (c) 2015年 hopy. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
- (IBAction)add:(id)sender;
@property (weak) IBOutlet NSTableView *tableView;

@property (weak) IBOutlet NSTextField *textField;

@end

AppDelegate.m

//
//  AppDelegate.m
//  TodoList
//
//  Created by kinds on 15/6/28.
//  Copyright (c) 2015年 hopy. All rights reserved.
//

#import "AppDelegate.h"

@interface AppDelegate (){
    NSMutableArray *todo_list;
    //NSMutableDictionary *todo_list_dict;
}

@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate

-(id)init{
    self = [super init];
    if(self){
        todo_list = [NSMutableArray array];
        //todo_list_dict = [NSMutableDictionary dictionary];
    }
    return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
}

- (void)applicationWillTerminate:(NSNotification *)aNotification {
    // Insert code here to tear down your application
}

-(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tableColumn
           row:(NSInteger)row{
    //NSLog(@"%s:%@",__func__,[tableColumn identifier]);
    NSString *colID = [tableColumn identifier];
    NSDictionary *dict = [todo_list objectAtIndex:row];
    return [dict objectForKey:colID];
    //return [todo_list objectAtIndex:row];
}

-(void)tableView:(NSTableView*)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn*)tableColumn
             row:(NSInteger)row{
    NSDictionary *dict = @{@"date":short_now_string(),@"note":obj};
    [todo_list replaceObjectAtIndex:row withObject:dict];
    [_tableView reloadData];
}

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tv{
    return (NSInteger)[todo_list count];
}

NSString* short_now_string(void){
    NSDateFormatter *ft = [NSDateFormatter new];
    ft.dateFormat = @"Y-M-d H:m:s z";
    return [ft stringFromDate:[NSDate new]];
}

- (IBAction)add:(id)sender {
    NSString *str = [_textField stringValue];
    if([str length] == 0)
        return;
    //[todo_list addObject:str];
    //NSDateFormatter *ft = [NSDateFormatter new];
    //ft.dateFormat = @"Y-M-d H:m:s z";
    NSDictionary *dict = @{@"date":short_now_string(),@"note":str};
    [todo_list addObject:dict];
    [_tableView reloadData];
    [_textField setStringValue:@""];
}
@end

Cocoa练习01:一个简单的Todo list程序的更多相关文章

  1. ASP.NET Core Blazor WebAssembly实现一个简单的TODO List

    基于blazor实现的一个简单的TODO List 最近看到一些大佬都开始关注blazor,我也想学习一下.做了一个小的demo,todolist,仅是一个小示例,参考此vue项目的实现http:// ...

  2. 一个简单的MDI示范程序(Delphi)

    http://www.cnblogs.com/pchmonster/archive/2012/01/07/2316012.html 最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI ...

  3. 一个简单的P2P传输程序

    写了一个简单的P2P传输程序,在P2P的圈子中传输文件,不过为了简便,这个程序没有真正的传输文件,只是简单的判断一下文件的位置在哪里.这个程序可以处理当有一个peer闪退的情况,在这种情况下,剩下的p ...

  4. IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序

    前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...

  5. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcar ...

  6. 一个简单的DDraw应用程序2

    //------------------------------------------------------------------------- // 文件名 : 6_1.cpp// 创建者 : ...

  7. 一个简单的DDraw应用程序

        阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...

  8. Linux内核监控模块-1-驱动模块(LKM)开发(以一个简单的hello world程序为例)

    在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,LKM),动态的加载到Linux内核中.那么这篇就简单的介绍一下怎样做一个这样的驱动模块.   以简单的hello world程序为 ...

  9. C++ 容器的综合应用的一个简单实例——文本查询程序

    C++ 容器的综合应用的一个简单实例——文本查询程序 [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例.通过实现一个简单的文本查 ...

随机推荐

  1. 【IOS 开发】基本 UI 控件详解 (UIDatePicker | UIPickerView | UIStepper | UIWebView | UIToolBar )

    转载注明出处 : http://blog.csdn.net/shulianghan/article/details/50348982 一. 日期选择器 (UIDatePicker) UIDatePic ...

  2. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  3. Android 增量更新和升级

    在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接.虽然网上将热修复的文章很多,不过我还是想说原理,然 ...

  4. C语言一个双向链表的实现

    首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下: #ifndef DList_H #define DList_H typedef int Item; typedef struct ...

  5. python在windows下使用setuptools安装egg文件

    最近和同学做个东西,需要安装python的第三方函数库,看了网上的介绍,很是麻烦,这是我实践总结出来的,希望对大家有用. 以安装第三方库networkx 为例,其余函数库都是一个套路,看完就会滴. 1 ...

  6. 利用OpenCV的人脸检测给头像带上圣诞帽

    我们来看下效果 原图: 效果: 原理其实很简单: 采用一张圣诞帽的png图像作为素材, 利用png图像背景是透明的,贴在背景图片上就是戴帽子的效果了. 人脸检测的目的主要是为了确定贴帽子的位置,类似p ...

  7. android开发要避免的那些坑

    SparseArray 目前有很多地方从性能优化方说使用SparseArray来替换hashMap,来节省内存,提高性能. Linkify.addLinks() 这个类可以更方便的为文本添加超链接. ...

  8. 分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)

    当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚 ...

  9. java 的序列化和反序列化的问题

    引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口, ...

  10. 我眼中的Linux设备树(一 概述)

    一 概述设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡A ...