学习IOS两个月,看无线互联的视频和一些东拼西凑的博客,基础没有打好,学习的条理不清晰。还是通过东拼西凑的方式做了一个界面很简单的ToDoList应用,用到一些很基础的知识来实现安排计划、标记完成和取消标记、删除这些十分简单的功能(功能简单到还没有中文输入)。

ios 系统toast 苹果手机to do list_ios

如上图所示,在textfield框中输入你的计划,点击“Go!”,计划就会在下方列表中显示,当点击列表中每行右端的小方格或者选中每一行,就会标记计划,再次点击取消标记,标记标志为方格中的对勾图形。

ios 系统toast 苹果手机to do list_Go_02

将已经显示的计划选中向左方滑动,出现删除选项,点击删除。

这么一个简单的东西,而且还缺少了很多必须要完善的功能,我还是折腾了四五天才勉强做出来,让我深刻地体会到“盲人摸象”和“磨刀不误砍柴工”,还是回去把OC基础语法的视频再过一遍。

在这个程序的编写中,我初步(但是还没有完全)形成mvc模式,传输数据在命名为Task的类中定义:
//Task.h
#import <Foundation/Foundation.h>

@interface Task : NSObject
@property (nonatomic, strong) NSString *content;//输入的计划内容
@property (nonatomic, assign) BOOL isMark;//标记标志量
@property (nonatomic, strong) NSString *date;//计划建立时间
@end
//Task.m
#import "Task.h"

@implementation Task
- (id)init
{
    self = [super init];

    if (self) {
        NSDate *today = [NSDate date];
        NSDateFormatter *formate = [[NSDateFormatter alloc]init];
        [formate setDateFormat:@"hh:mm"];//取出当前时间
//        [formate setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
        _date = [formate stringFromDate:today];
    }

    return self;
}
@end

输入需要的控件在inputTask类中定义:

//imputTask.h
#import <UIKit/UIKit.h>

@interface InputTask : UIView<UITextFieldDelegate>

@property (nonatomic, strong) UITextField *inputText;//输入框
@property (nonatomic, strong) UIButton    *button;//按钮“Go!”

@end
#import "RootViewController.h"
#import "InputTask.h"

@implementation InputTask
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:(CGRect)frame];
    if (self) {
        _inputText = [[UITextField alloc] initWithFrame:CGRectMake(60, 30, 200, 35)];
        _inputText.delegate = self; // 设置代理
        _inputText.textColor = [UIColor greenColor];
        _inputText.placeholder = @"input";
        _inputText.adjustsFontSizeToFitWidth = YES;
        _inputText.clearsOnBeginEditing = YES;
        _inputText.clearButtonMode = UITextFieldViewModeWhileEditing;

        _inputText.borderStyle = UITextBorderStyleRoundedRect;
        self.userInteractionEnabled = YES;
//        [_inputText.window makeKeyAndVisible];

        _button = [UIButton buttonWithType:UIButtonTypeCustom];
        _button.frame = CGRectMake(265, 30, 50, 35);
//        [_button addTarget:self action:@selector() forControlEvents:UIControlEventTouchUpInside];
        [_button setTitle:@"Go!" forState:UIControlStateNormal];
        [_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [_button setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];

        [_button sizeToFit];
        [self addSubview:_inputText];
        [self addSubview:_button];
    }
    return self;
}

#pragma mark - textField Delegate

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    NSLog(@"textFieldShouldBeginEditing");
    [textField.window makeKeyAndVisible];
    return YES; // [textField becomeFirstResponder];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (!textField.window.isKeyWindow)
    {
        [textField.window makeKeyAndVisible];
    }
    NSLog(@"textFieldDidBeginEditing");
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    NSLog(@"textFieldShouldEndEditing");
    return YES; // [tf resignFirstResponder];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSLog(@"textFieldDidEndEditing : %@", textField.text);
}

- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
    NSLog(@"shouldChangeCharactersInRange : %@", string);
    NSLog(@"%@", textField.text);
    return YES;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    NSLog(@"textFieldShouldClear");
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}


@end

列表在RootViewController中实现:

//RootViewController.h
#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

@end
#import "RootViewController.h"
#import "TaskCell.h"
#import "Task.h"
#import "InputTask.h"

@interface RootViewController ()
{
    UITableView *_tableView;
    NSMutableArray *_taskList;
    InputTask *_inputTask;
//    UITextField *_tf;
//    UIButton    *_button;
}
@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)loadView
{
    UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.view = view;


    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 70, 320, kDeviceHeight-70) style:UITableViewStylePlain];

    _tableView.dataSource = self;

    _tableView.delegate = self;

    _tableView.rowHeight = 60;


    _inputTask = [[InputTask alloc] initWithFrame:CGRectMake(0, 0, kDeviceWidth, 65)];

    [_inputTask.button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_inputTask];
//    [self.view addSubview:_button];
    [self.view addSubview:_tableView];

}

- (void)buttonAction:(id)sender
{
//    NSLog(@"%@", _tf.text);
    Task *task = [[Task alloc] init];
//    task.date = @"今天";
    task.content = _inputTask.inputText.text;
//    task.content = _tf.text;
    [_taskList insertObject:task atIndex:0];
    [_tableView reloadData];
    _inputTask.inputText.text = @"";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _taskList = [[NSMutableArray alloc] initWithCapacity:20];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - TableView Datasource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
    return [_taskList count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentify = @"cell";

    TaskCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentify];
    Task *task = _taskList[indexPath.row];
    if (cell == nil) {
        cell = [[TaskCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentify];
    }

    cell.markButton.tag = indexPath.row;
    cell.buttonClick = ^() {
        task.isMark = !task.isMark;
        [_tableView reloadData];
    };
    cell.date.text = task.date;

    cell.markButton.selected = task.isMark;
    cell.textLabel.text = task.content;


 /*
//    UIButton *btn4 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
//    btn4.frame = CGRectMake(270.0f, 0.0f, 50.0f, 40.0f);
//    [btn4 setTitle:@"删除" forState:UIControlStateNormal];
//    [btn4 addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
//    [cell addSubview:btn4];
   */
    return cell;

}

- (void)test
{
//    UITextField *tf = (UITextField *)[self.window viewWithTag:101];
    // 将键盘移除
//    [tf resignFirstResponder];
    NSLog(@"hha");
}

//返回YES,表示支持单元格的移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

//单元格返回的编辑风格,包括删除 添加 和 默认  和不可编辑三种风格
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleDelete;
}

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle==UITableViewCellEditingStyleDelete) {
        //        获取选中删除行索引值
        NSInteger row = [indexPath row];
        //        通过获取的索引值删除数组中的值
        [_taskList removeObjectAtIndex:row];
        //        删除单元格的某一行时,在用动画效果实现删除过程
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cellView = [tableView cellForRowAtIndexPath:indexPath];
    if (cellView.accessoryType == UITableViewCellAccessoryNone) {
//        cellView.accessoryType=UITableViewCellAccessoryCheckmark;
//       markButton.selected = !markButton.selected;
        Task *task = _taskList[indexPath.row];
        task.isMark = !task.isMark;
        [tableView reloadData];
    }
    else {
        cellView.accessoryType = UITableViewCellAccessoryNone;
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

UITableView 的单元格cell 中包含了标记按钮和显示时间的UILable,在 TaskCell类中实现:

#import <UIKit/UIKit.h>

@interface TaskCell : UITableViewCell
@property (nonatomic, strong) UIButton *markButton;
@property (nonatomic, strong) UILabel *date;
@property (nonatomic, copy) void (^buttonClick)();
@end
#import "TaskCell.h"

@implementation TaskCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _markButton = [UIButton buttonWithType:
                       UIButtonTypeCustom];
        _markButton.frame = CGRectMake(270, 0, 50, 50);
        [_markButton setImage:[UIImage imageNamed:@"checkbox_priority"] forState:UIControlStateNormal];
        [_markButton setImage:[UIImage imageNamed:@"checkbox_checked"] forState:UIControlStateSelected];
        [_markButton addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:_markButton];

        _date = [[UILabel alloc] initWithFrame:CGRectMake(270, 40, 50, 20)];
        [self addSubview:_date];

    }

    return self;
}

- (void)click:(id)sender {
    if (_buttonClick) {
        _buttonClick();
    }
}

- (void)awakeFromNib {
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

这个版本还有很多地方没完善,比如中文输入、响应键盘上的return、我没掌握的block语法(响应标记按钮事件)、没掌握http通信与后台传输数据、单元格动画、丑的不堪的界面等等。盲人摸象做事的效率低下,质量还很差,如果没有导师指导,恐怕要更长的时间才能完成。然而,这并没有完成,我会重新做一个新的版本,加上登陆界面,下一次题目就不能叫盲人摸象了,要做到柳暗花明。