本篇文章分享给大家,希望大家喜欢吼
文章看看处,点击

1.框架
我使用Realm来作为数据库的框架,还有SDAutoLayout做适配。不会用的,也没关系,这两个框架简单的很。
2.逻辑设置
日记记录的时候就记录三个数据,标题,内容,写日记的时间。这个时间精确到秒,相当于数据库的主键。我们点击以前写的日记项,也可以对其进行修改,这个时间也会修改。
3.界面设置
我先贴两个图片大家理解一下就好,反正用的控件不多
主界面一个列表心事所有日记的信息,和一个添加按钮跳转写日记的界面

写日记的界面,两个TextView作为主体,三个按钮分别承当保存,取消,删除的功能
,这个删除的按钮只会在通过点击一个日记的信息列表项进入到这个界面才会显示。

4.主体逻辑代码
主界面的逻辑代码

//
// MainViewController.m
// Note
//
// Created by shanreal-iOS on 2017/12/15.
// Copyright ? 2017年 shanreal.LongZhenHao. All rights reserved.
//
#import "MainViewController.h"
#import "MainView.h"
#import "MainModel.h"
#import "MainTableViewCell.h"
#import "DetailViewController.h"
#import "NoteBean.h"
@interface MainViewController ()<UITableViewDelegate,UITableViewDataSource>
@property(nonatomic,strong)MainView* mainview;
@property(nonatomic,strong)MainModel* model;
@property(nonatomic,strong)NSMutableArray *dataArray;
@end
@implementation MainViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationController.navigationBar.hidden=YES;
self.navigationController.navigationBar.barStyle=UIBarStyleBlack;
self.mainview = [[MainView alloc]initWithFrame:self.view.frame];
[self.mainview viewInit];
[self.mainview.tableview_main setSeparatorStyle:UITableViewCellSeparatorStyleNone];
self.mainview.tableview_main.bounces=NO;
self.mainview.tableview_main.delegate=self;
self.mainview.tableview_main.dataSource=self;
[self.mainview.btn_add addTarget:self action:@selector(addAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.mainview];
/*
RLMResults *delete = [NoteBean allObjects];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
for (NoteBean *bean in delete) {
[realm deleteObject:bean];
}
}];
*/
NSString* a =[TimeStampUtil getCurrentTimeStemp];
NSLog(a);
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.dataArray = [NSMutableArray new];
RLMResults *data = [[NoteBean allObjects] sortedResultsUsingKeyPath:@"date" ascending:NO];
[[RLMRealm defaultRealm] transactionWithBlock:^{
for (NoteBean *bean in data) {
[self.dataArray addObject:bean];
}
}];
[self.mainview.tableview_main reloadData];
NSLog(@"%d",self.dataArray.count);
}
-(void)addAction{
DetailViewController* vc = [[DetailViewController alloc]init];
vc.sort = 0;
[self.navigationController pushViewController:vc animated:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellIdentifier = [NSString stringWithFormat:@"MainTableViewCell%ld%ld", [indexPath section], [indexPath row]];
MainTableViewCell *cell = (MainTableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[MainTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
NoteBean* bean = self.dataArray[indexPath.row];
cell.label_title.text = bean.title;
cell.label_date.text = bean.date;
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 50*MY;
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[theTableView deselectRowAtIndexPath:indexPath animated:YES];
NSLog(@"selected %ld row", indexPath.row);
DetailViewController* vc = [[DetailViewController alloc]init];
vc.sort = 1;
vc.date = ((NoteBean*)self.dataArray[indexPath.row]).date;
vc.title = ((NoteBean*)self.dataArray[indexPath.row]).title;
vc.content = ((NoteBean*)self.dataArray[indexPath.row]).content;
[self.navigationController pushViewController:vc animated:YES];
}
@end

写日期的界面的逻辑代码

#import <UIKit/UIKit.h>
#import "DetailView.h"
#import "DetailModel.h"
#import "NoteBean.h"
@interface DetailViewController : UIViewController
@property(nonatomic,assign)int sort;
@property(nonatomic,strong)NSString* date;
@property(nonatomic,strong)NSString* title;
@property(nonatomic,strong)NSString* content;
@end
//
// DetailViewController.m
// Note
//
// Created by shanreal-iOS on 2017/12/15.
// Copyright ? 2017年 shanreal.LongZhenHao. All rights reserved.
//
#import "DetailViewController.h"
@interface DetailViewController ()
@property(nonatomic,strong)DetailView* detailview;
@end
@implementation DetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationController.navigationBar.hidden=YES;
self.navigationController.navigationBar.barStyle=UIBarStyleBlack;
self.detailview = [[DetailView alloc]initWithFrame:self.view.frame];
[self.detailview viewInit];
[self.detailview.btn_save addTarget:self action:@selector(saveAction) forControlEvents:UIControlEventTouchUpInside];
[self.detailview.btn_back addTarget:self action:@selector(cancelAction) forControlEvents:UIControlEventTouchUpInside];
[self.detailview.btn_delete addTarget:self action:@selector(deleteAction) forControlEvents:UIControlEventTouchUpInside];
self.detailview.tf_title.text = self.title;
self.detailview.tv_content.text = self.content;
[self.view addSubview:self.detailview];
if(self.sort == 1)
self.detailview.btn_delete.hidden = NO;
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)deleteAction{
NSLog(@"delete");
NSPredicate *pred = [NSPredicate predicateWithFormat:@"date = %@",
self.date];
RLMResults<NoteBean *> *beans = [NoteBean objectsWithPredicate:pred];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
NoteBean *bean = [beans objectAtIndex:0];
[realm deleteObject:bean];
}];
[ShowToastView showToastView:self.view WithMessage:@"删除成功"];
[self performSelector:@selector(cancelAction) withObject:nil afterDelay:2];
}
-(void)saveAction{
NSString* title = self.detailview.tf_title.text;
NSString* content = self.detailview.tv_content.text;
if([title isEqualToString:@""]||title==NULL){
[ShowToastView showToastView:self.view WithMessage:@"标题没写"];
return ;
}
if([content isEqualToString:@""]||content==NULL){
[ShowToastView showToastView:self.view WithMessage:@"内容没写"];
return ;
}
NSLog(@"save %@ %@",title,content);
if(self.sort == 0){
NoteBean* bean = [[NoteBean alloc]init];
bean.date = [TimeStampUtil getCurrentTimeStemp];
bean.title = self.detailview.tf_title.text;
bean.content = self.detailview.tv_content.text;
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[realm addObject:bean];
}];
[ShowToastView showToastView:self.view WithMessage:@"保存成功"];
}else if(self.sort == 1){
NSPredicate *pred = [NSPredicate predicateWithFormat:@"date = %@",
self.date];
RLMResults<NoteBean *> *beans = [NoteBean objectsWithPredicate:pred];
[[RLMRealm defaultRealm] transactionWithBlock:^{
NoteBean *bean = [beans objectAtIndex:0];
bean.date = [TimeStampUtil getCurrentTimeStemp];
bean.title = self.detailview.tf_title.text;
bean.content = self.detailview.tv_content.text;
}];
[ShowToastView showToastView:self.view WithMessage:@"修改成功"];
}
[self performSelector:@selector(cancelAction) withObject:nil afterDelay:2];
}
-(void)cancelAction{
NSLog(@"cancel");
[self.navigationController popViewControllerAnimated:YES];
}
@end

最后我奉上源代码地址
传送

日记app制作(OC)相关推荐

  1. Android 一款十分简洁、优雅的日记APP

    本篇由 DeveloperHaoz 投稿, 转载请注明出处 作者:DeveloperHaoz 说明:本文的内容主要是解析日记APP的制作流程,以及代码的具体实现,若有什么不足之处,还请提出建议 本文的 ...

  2. 手机app软件测试教程,手机app制作软件测试app的技巧和方式(上)

    测试(Testing)是写程序很重要的过程之一.当手机app制作软件一步步完成,过程中你需要不断的测试,随时掌握画面.写出来的功能是否在交到使用者手上时是正常运作.而Thunkable平台上提供了什么 ...

  3. 《iVX 高仿美团APP制作移动端完整项目》03 推介信息及推荐商家分析及制作

    点击整个专栏查看其它系列文章 (系列文章更新中-):<iVX 高仿美团APP制作移动端完整项目> 项目界面预览: 一.推荐信息制作 推荐信息与之前的标题下推荐信息制作类似: 此时依旧创建一 ...

  4. 《iVX 高仿美团APP制作移动端完整项目》02 搜索、搜索提示及类别需求分析思路及制作流程

    点击整个专栏查看其它系列文章 (系列文章更新中-):<iVX 高仿美团APP制作移动端完整项目> 项目界面预览: 一.搜索制作 在上一节中我们完成了标题头的制作,接下来我们查看如何制作搜索 ...

  5. 《iVX 高仿美团APP制作移动端完整项目》01 标题需求分析思路及制作流程

    点击整个专栏查看其它系列文章 (系列文章更新中-):<iVX 高仿美团APP制作移动端完整项目> 项目界面预览: 一.创建项目 首先打开在线编辑器地址:https://editor.ivx ...

  6. vc6开发一个抓包软件_开发一个软件多少钱?传统app开发与0代码app制作方法对比...

    开发一个软件多少钱?app开发难吗?app制作需要哪些流程? app开发很难:按照传统的开发方式需要最少5名以上的技术人员,团队配合花费3个月左右的时间才能搞定,成本20万以上. app开发也很简单: ...

  7. android 登录界面开源代码_【程序源代码】一个安卓查询类app制作的开源项目

    " 关键字:工作流 框架 springboot" 正文:一个学习安卓查询类app制作的开源项目.可以用来联系查询类app的编写. 01 - android studio最近势头好猛 ...

  8. 简单易用的APP制作软件,KM盒子V6.3版发布

    KM盒子是一款支持文字.表格.图片.音视频混合排版的手机APP制作软件.软件操作简单无需学习专业的手机编程知识,使用图片.文档或网页等方式即可快速制作生成手机APP应用. KM盒子V6.3版下载网址: ...

  9. 制作好的app需要服务器吗,在直播app制作过程中,服务器是如何配置的?

    不论是一对多直播还是一对一直播app制作,关于服务器的配置和成本是大多数运营商比较关心和头疼的问题.一般来说,在直播app运营的每个阶段,所安排的服务器台数和负责的功能都是不一样的.那么如何在有限的成 ...

  10. Android studio课程设计开发实现---日记APP

    Android studio课程设计开发实现-日记APP 文章目录 Android studio课程设计开发实现---日记APP 前言 一.效果 二.功能介绍 1.主要功能 2.涉及知识点 三.实现思 ...

最新文章

  1. hdu 1116 Play on Words(欧拉通路)
  2. J2EE用监听器实现同一用户只能有一个在线
  3. centos7 安装rabbitMq
  4. GCC 用 C++ 来编译(酷壳)
  5. Interlocked原子访问系列函数
  6. 20165203《Java程序设计》第四周学习总结
  7. Ubuntu中vim编辑器的常用操作
  8. 数据中心运维管理方案
  9. 人脸识别7-人脸图片相似度
  10. java webservice调用sap_java调用sap webservice
  11. 小米6通话音量补丁_手机通话声音小?只需打开这个开关,音量既大又清晰
  12. 基于javacv实现视频转mp4
  13. 2020年中国报废汽车拆解回收行业市场现状分析,汽车报废率远低于发达国家「图」
  14. linux 下简单安装 pathogen.vim
  15. 三星手机「我的文件」应用闪退问题的解决方法
  16. 4g+uim卡是什么卡_你知道SIM卡是什么吗?
  17. 同卵双胞胎的2型糖尿病的易感性位点的综合表观基因分析
  18. 故障分析 | Cassandra 用户信息 list Error
  19. Linux内核网络中的软中断ksoftirqd
  20. 自己动手丰衣足食之征服jQuery插件编写

热门文章

  1. 《流媒体服务器》专栏总览丨蓄力计划
  2. diffuse、specular贴图的光照
  3. R语言数据可视化之美:专业图表绘制指南
  4. 合影效果java_6个姿势,教你拍好合影
  5. Firefox 和 Firefox Nightly 同步服务:切换国内和国际服务器的方法
  6. WINDOWS系统文件夹、实用自带工具、DOS、进程等,解析集合(积累)较实用...
  7. 几个好看的echarts表格效果
  8. c语言猜拳游戏教案,幼儿园中班游戏《猜拳游戏》的教案
  9. 如何实现一个游戏地图编辑器
  10. python歌词统计_Python大佬分析了15万歌词,告诉你民谣歌手们到底在唱什么