写一个简单的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. springMVC+Hibernate4+spring整合实例二(实例代码部分)

    UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...

  2. I/O操作之概述与导读

    I/O流可以表示很多不同种类的输入源和输出目的地,包括简单的字节流,基本数据(int.boolean.double等),本地化的字符,以及对象.一些流只是简单地传递数据,还有一些流可以操作和转换数据 ...

  3. Android的TabHost组件-android的学习之旅(四十)

    TabHost简介 虽然,官方建议用Fagment取代TabHost,但是我们还是大概的介绍一下.TabHost是一种非常简单的组件,TabHost可以很方便的在窗口放置多个标签页,每一个标签页相当于 ...

  4. iOS中 动态热修补技术JSPatch 韩俊强的博客

    .1.4) JSPatch bridge Objective-C and JavaScript. You can call any Objective-C class and method in Ja ...

  5. (八十八)VFL语言初步 - 实现布局

    [基本语法] VFL的语法为H:和V:开头,代表水平和垂直. 接下来如果要涉及距离,使用|-x-,x为距离的点数. 对于视图,用[ ]包围,例如[blueView]. ①下面的语句实现了blueVie ...

  6. Tom DeMarco:软件工程这个概念已过时?

    原文作者:Tom Demarco,写于2009年7月 作者简介:Tom DeMarco是大西洋系统协会(www.atlsysguild.com)的负责人.他的职业生涯开始于贝尔实验室,是结构化分析和设 ...

  7. UNIX环境高级编程——system函数

    system函数 功能:调用fork产生子进程,由子进程来调用:/bin/sh -c command来执行参数command所代表的命令,阻塞当前进程直到command命 令执行完毕. int sys ...

  8. Opencv2.4.9、VS2010配置及grabcut代码实例

    最近opencv库更新到了2.4.9,作为小码农的我紧跟时代的步伐,装了2.4.9这个库.以下是我的配置步骤: 1.从http://opencv.org/上下载opencv2.4.9文件,由于我用的是 ...

  9. 读书笔记 - reword (重来)

    reword (重来) 虽然我是一个不是很喜欢看书的人,但是公认的是看书对提高个人的水平是很有帮助的. 而且我想,如果我要写一本书,我一定会经过多次校验.经过长时间思考确保无误后才会出版的.所以我想看 ...

  10. Android开机键失灵启动手机的解决办法

    问题描述 Android手机的关机键损坏,无法开机. 解决方法 将手机通过USB线链接电脑,进入命令行,找到adb命令所在目录,运行如下命令: adb reboot 注意:用这种方法的前提是,如果你当 ...