前言
主要是MVC模式的应用一、准备工作
Xcode环境的配置,File ->new->project,选择ios下的app
删除目录下的storyboard文件,我们这里讲述的是依靠代码实现,这样也便于后期的合成和维护。
同时删除delegate的两个文件,同时设置Main interface勾选成无
二、步骤
1.定义好控件,设计好界面
首先我们从这里可以知道,控件有按钮,输入框,展示框
先说一下UI界面的一个布局,一般来说,以一个UIwindow作为最底层的UI,承载控制器,控制器控制着若干个view
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) UITextField *taskField;//输入框
@property (nonatomic) UITableView *taskTable;//展示框
@property (nonatomic) UIButton *insertButton;//按钮
@property (nonatomic) UIWindow *window;
@property (nonatomic) NSMutableArray *tasks;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/*
CGrect是一个定义矩形的类,定义好中心和长度宽度,便可以声明一个矩形
这个矩形就是就后面控件的一个属性
*/
CGRect winFrame = [[UIScreen mainScreen] bounds];
CGRect buttonFrame = CGRectMake(228, 40, 72, 31);
/*
定义控制器的view的背景颜色
*/
self.view.backgroundColor = [UIColor whiteColor];
self.taskTable = [[UITableView alloc]initWithFrame:CGRectMake(0, 80, winFrame.size.width, winFrame.size.height - 100)];
self.taskTable.separatorStyle = UITableViewCellSeparatorStyleNone;
self.taskTable.dataSource = self;
[self.taskTable registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
/*
设置输入框的各项属性
*/
self.taskField = [[UITextField alloc] initWithFrame:CGRectMake(20, 40, 200, 31)];
self.taskField.keyboardType = UITextBorderStyleRoundedRect;
self.taskField.placeholder = @"Type a task, tap Insert";
/*
设置按钮的各项属性
*/
self.insertButton = [UIButton buttonWithType:UIButtonTypeRoundedRect ];
self.insertButton.frame = buttonFrame;
[self.insertButton setTitle:@"Insert" forState:UIControlStateNormal];
/*
这部分将这些控件加入大view中,就是将子view加入视图中,
控制器本身有视图,视图中添加子视图
*/
[self.view addSubview:self.taskField];
[self.view addSubview:self.taskTable];
[self.view addSubview:self.insertButton];
[self.tasks writeToFile:docPach() atomically:YES];
}
@end
这样设计之后,运行工程,手机模拟器上就会展示界面,但是这个界面没有任何功能,我们需要编写代码,给对象添加行为。也就是说, 我们需要设计监听动作,当我们点击button按钮时,这个应用能有对应的处理动作
2.读入数据
代码如下(示例):
import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) UITextField *taskField;//输入框
@property (nonatomic) UITableView *taskTable;//表格视图
@property (nonatomic) UIButton *insertButton;//按钮@end
@property (nonatomic) UIWindow *window;
@property (nonatomic) NSMutableArray *tasks;
@end
NSString *docPach()
{
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [pathList[0] stringByAppendingPathComponent:@"data.td"];
}
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//self.tasks = [NSMutableArray array];
NSArray *plist = [NSArray arrayWithContentsOfFile:docPach()];
if (plist) {
self.tasks = [plist mutableCopy];
} else {
self.tasks = [NSMutableArray array];
}
// Do any additional setup after loading the view.
CGRect winFrame = [[UIScreen mainScreen] bounds];
CGRect buttonFrame = CGRectMake(228, 40, 72, 31);
//UIWindow *theWindow = [[UIWindow alloc] initWithFrame:winFrame];
// self.window = theWindow;
self.view.backgroundColor = [UIColor whiteColor];
self.taskTable = [[UITableView alloc]initWithFrame:CGRectMake(0, 80, winFrame.size.width, winFrame.size.height - 100)];
//self.taskTable.separatorStyle = UITableViewCellSeparatorStyleNone;
self.taskTable.separatorStyle = UITableViewCellSeparatorStyleNone;
self.taskTable.dataSource = self;
[self.taskTable registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
self.taskField = [[UITextField alloc] initWithFrame:CGRectMake(20, 40, 200, 31)];
self.taskField.keyboardType = UITextBorderStyleRoundedRect;
self.taskField.placeholder = @"Type a task, tap Insert";
self.insertButton = [UIButton buttonWithType:UIButtonTypeRoundedRect ];
self.insertButton.frame = buttonFrame;
[self.insertButton setTitle:@"Insert" forState:UIControlStateNormal];
/*
给按钮添加绑定事件
个人认为这个是整个ios应用的核心,有了这个,这个应用才算动起来
addTarget
*/
[self.insertButton addTarget:self action:@selector(addTasks:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.taskField];
[self.view addSubview:self.taskTable];
[self.view addSubview:self.insertButton];
[self.tasks writeToFile:docPach() atomically:YES];
}
#pragma mark -ACTIONS
- (void)addTasks:(id)sender
{
NSString *text = [self.taskField text];
if ([text length] == 0){
return ;
}
NSLog(@"Task entered: %@", text);
[self.tasks addObject:text];
[self.taskTable reloadData];
[self.taskField setText:@""];
[self.taskField resignFirstResponder];
}
#pragma mark - 管理表格视图
/*
tableView是实现了UITableview中的协议
也就是OC中一个很重要的点@protocol
*/
- (NSInteger) tableView : (UITableView *)tableView
numberOfRowsInSection : (NSInteger)section
{
return [self.tasks count];
}
- (UITableViewCell *) tableView : (UITableView *)tableView
cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
UITableViewCell *c = [self.taskTable dequeueReusableCellWithIdentifier:@"Cell"];
NSString *item = [self.tasks objectAtIndex:indexPath.row];
c.textLabel.text = item;
return c;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// [self.taskField becomeFirstResponder];
// [self.taskField becomeFirstResponder];
}
@end
这样设计之后,运行工程,手机模拟器上不仅会展示界面,而且能实现 存储功能,累死浏览器的浏览历史保存