iOS 日記app的製作過程(Objective-C)

来源:https://www.cnblogs.com/jianpanwuzhe/archive/2018/01/31/8393019.html
-Advertisement-
Play Games

1.框架 我使用Realm來作為資料庫的框架,還有SDAutoLayout做適配。不會用的,也沒關係,這兩個框架簡單的很。 2.邏輯設置 日記記錄的時候就記錄三個數據,標題,內容,寫日記的時間。這個時間精確到秒,相當於資料庫的主鍵。我們點擊以前寫的日記項,也可以對其進行修改,這個時間也會修改。 3. ...



1.框架
我使用Realm來作為資料庫的框架,還有SDAutoLayout做適配。不會用的,也沒關係,這兩個框架簡單的很。


2.邏輯設置

日記記錄的時候就記錄三個數據,標題,內容,寫日記的時間。這個時間精確到秒,相當於資料庫的主鍵。我們點擊以前寫的日記項,也可以對其進行修改,這個時間也會修改。

3.界面設置
我先貼兩個圖片大家理解一下就好,反正用的控制項不多
主界面一個列表心事所有日記的信息,和一個添加按鈕跳轉寫日記的界面
![這裡寫圖片描述](http://img.blog.csdn.net/20171218141412941?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejk3OTQ1MTM0MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

寫日記的界面,兩個TextView作為主體,三個按鈕分別承當保存,取消,刪除的功能
,這個刪除的按鈕只會在通過點擊一個日記的信息列表項進入到這個界面才會顯示。

![這裡寫圖片描述](http://img.blog.csdn.net/20171218141446101?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejk3OTQ1MTM0MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

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

```


最後我奉上源代碼地址
http://download.csdn.net/download/z979451341/10163474

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 樹形層次結構(Hierarchy)經常出現在有結構的數據中,T-SQL新增數據類型HierarchyID, 其長度可變,用於存儲層次結構中的路徑。HierarchyID表示的層次結構是樹形的,由應用程式來生成和分配 HierarchyID的值,建立父子節點之間的關係。 HierarchyID數據類型 ...
  • 分為四步:詳細介紹如何創建表空間 註意點: 1.如果在PL/SQL 等工具里打開的話,直接修改下麵的代碼中[斜體加粗部分]執行 2.確保路徑存在,比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路徑存在 /*分為四步 */ /*第1步:創建臨時表空間 */ 複製代碼 ...
  • 一、定義變數 --簡單賦值 declare @a int set @a=5 print @a --使用select語句賦值 declare @user1 nvarchar(50) select @user1='張三' print @user1 declare @user2 nvarchar(50) ...
  • 1、基礎語法 http://692088846.iteye.com/blog/2017137 (%type、%rowtype、if\if else\if elseif else、while、do..while、游標、異常、函數、過程) 1.1 聲明變數賦值並輸出 set serveroutput o ...
  • 外鍵:使兩張表之間存在關聯 特點: 1.從表外鍵的值是對主表主鍵的引用 2.從表外鍵類型,必須與主表主鍵類型一致 示例: 創建兩個表並準備數據: USE mybase; CREATE TABLE category( cid VARCHAR(32) PRIMARY KEY, cname VARCHAR ...
  • 一、概述 關於Mycat的原理網上有很多,這裡不再詳述,對於我來說Mycat的功能主要有如下幾種: 1.Mysql主從的讀寫分離 2.Mysql大表分片 3.其他資料庫例如Oracle,MSSQL,DB2等的讀寫分離和分片。 之所以第3點單獨列出來只是因為它不常用,而且使用的JDBC,連接Mysql ...
  • 一,iOS硬體/設備的類型。 iPad的問世,就是在這一方向上邁出的第一步。第一代iPad使用了ARM Cortex-A8架構的CUP,它的速度大約是第一代iPhone所使用CPU速度的兩倍。 iPad2和iPhone4S則是另一個巨大的跨越。它們都使用了ARM Cortex-A9架構的雙核處理器, ...
  • 2018-01-3116:58:12 今天這一天可把我累壞了,累到崩潰!本來計劃在vs2010上面安裝opencv的,可照著教程裝了半天,總會出現和教程不一樣的界面,所以,再加上,最近想學安卓的opencv,於是乎便轉戰eclipse安裝opencv opencv在vs2010上面的配置教程http ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...