1.项目

新建一个书签管理器的项目,能够存储书签的网址、中文名、星级、訪问量和权限信息。具有增、删、改、查和排序的功能。

2.找对象,抽象类

书签管理器,书签管理器。书签管理器……  多读几次书是不是就找到了对象。书签和管理器。书签包括网址、中文名和星级等信息。管理器里面有书签。那么我就能够抽象出两个类了。一个是书签类。一个是管理器类。

我们在书签管理器里面增、删、改、查和排序书签。在书签里面保存书签具有的属性数据。

3.对象的属性和行为分析



书签管理器的存储关系的分析:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

4.类的实现

1.书签类的实现

#import <Foundation/Foundation.h>
//书签类 存储书签详细的信息/数据
@interface BookMark : NSObject{
NSString * _url; //网址
NSString * _title; //标题
NSUInteger _stars; //星级
NSUInteger _vist; //訪问人数
char _level; //权限
}
- (void) setUrl:(NSString *)url;
- (void) setTitle:(NSString *)title;
- (void) setStars:(NSUInteger)stars;
- (void) setVist:(NSUInteger)vist;
- (void) setLevel:(char)level; - (NSString *) getUrl;
- (NSString *) getTitle;
- (NSUInteger) getStars;
- (NSUInteger) getVist;
- (char) getLevel; //构造方法 存储数据
- (instancetype)initWithUrl:(NSString *)url
withTitle:(NSString *)title
withSarts:(NSUInteger)stars
withVist:(NSUInteger)vist
withLevel:(char)level; @end
#import "BookMark.h"
@implementation BookMark
- (instancetype) initWithUrl:(NSString *)url withTitle:(NSString *)title withSarts:(NSUInteger)stars withVist:(NSUInteger)vist withLevel:(char)level{
self = [super init];
if (self) {
_url = url;
_title = title;
_stars = stars;
_vist = vist;
_level = level;
}
return self;
}
- (void) setUrl:(NSString *)url{
_url = url;
}
- (void) setTitle:(NSString *)title{
_title = title;
}
- (void) setStars:(NSUInteger)stars{
_stars = stars;
}
- (void) setVist:(NSUInteger)vist{
_vist = vist;
}
- (void) setLevel:(char)level{
_level = level;
}
- (NSString *) getUrl{
return _url;
}
- (NSString *) getTitle{
return _title;
}
- (NSUInteger) getStars{
return _stars;
}
- (NSUInteger) getVist{
return _vist;
}
- (char) getLevel{
return _level;
}
@end

2.管理器类的实现

#import <Foundation/Foundation.h>
#import "BookMark.h"
//书签管理器类
@interface BookManager : NSObject{
NSMutableArray * _array;
}
- (instancetype)init;
//删除
- (void) removeBookMark:(NSString *)title;
//添加
- (void) addBookMarkWithUrl:(NSString *)url
withTitle:(NSString *)title
withStars:(NSUInteger)stars
withVist:(NSUInteger)vist
withLevel:(char)level;
//改动
- (void) modifyTitle:(NSString *)title withNewTitle:(NSString *)newTitle;
//查找
- (void) searchWithTitle:(NSString *)title;
- (void) sortWithStars;
- (void) showAllBookMark;
@end
#import "BookManager.h"

@implementation BookManager

- (instancetype)init{
self = [super init];
if (self) {
_array = [[NSMutableArray alloc] init];
}
return self;
}
//添加书签
- (void) addBookMarkWithUrl:(NSString *)url
withTitle:(NSString *)title
withStars:(NSUInteger)stars
withVist:(NSUInteger)vist
withLevel:(char)level{
for (int i = 0; i < [_array count]; i ++) {
if ([title isEqualToString:[_array[i] getTitle]]) {
NSLog(@"反复加入");
return;
}
}
//以下既能够使用构造方法也能够使用set方法
BookMark *book = [[BookMark alloc] initWithUrl:url withTitle:title withSarts:stars withVist:vist withLevel:level];
// BookMark * book = [[BookMark alloc] init];
// [book setUrl:url];
// [book setTitle:title];
// [book setStars:stars];
// [book setVist:vist];
// [book setLevel:level];
[_array addObject:book];
}
//删除书签
- (void) removeBookMark:(NSString *)title{
for (int i = 0; i < [_array count]; i ++) {
if ([title isEqualToString:[_array[i] getTitle]]) {
[_array removeObject:_array[i]];
return;
}
else NSLog(@"没有这个书签");
}
}
//改动书签
- (void) modifyTitle:(NSString *)title withNewTitle:(NSString *)newTitle{
for (int i = 0; i < [_array count]; i ++) {
if ([title isEqualToString:[_array[i] getTitle]]) {
[_array[i] setTitle:newTitle];
}
}
}
//查找书签
- (void) searchWithTitle:(NSString *)title{
int index = -1; //保存书签位置
//index = -1 表示没有找到相应的书签
//遍历书签。找到后就保存目标书签位置后退出循环
for (int i = 0; i < [_array count]; i ++) {
if([title isEqualToString:[_array[i] getTitle]])
{
index = i;
break;
}
}
if (index == -1) {
NSLog(@"没有找到须要查找的书签");
}
else NSLog(@"找了该书签 pos = %d",index);
}
- (void) sortWithStars{
//使用冒泡排序对书签对象进行排序
for (int i = 0; i < [_array count] - 1; i ++) { //控制排序的轮数
for (int j = 0; j < [_array count] - 1 - i; j ++) { //控制比較的次数
if ([_array[j] getStars] > [_array[j + 1] getStars]) {
NSArray * temp;
temp = _array[j];
_array[j] = _array[j + 1];
_array[j + 1] = temp;
}
}
}
}
- (void) showAllBookMark{
for (int i = 0; i < [_array count]; i ++) {
NSLog(@"网址:%@ 标题:%@ 星级:%ld 訪问量:%ld 权限:%c",
[_array[i] getUrl],
[_array[i] getTitle],
[_array[i] getStars],
[_array[i] getVist],
[_array[i] getLevel]);
}
}
@end

5.书签管理器的操作

这一步我们想象成是人在操作一个带界面的书签管理器,因为没有界面,我们就仅仅能在main函数里面操作了。比如:

#import <Foundation/Foundation.h>
#import "BookMark.h"
#import "BookManager.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//新建一个百度的书签
BookManager * myBookManager = [[BookManager alloc] init];
[myBookManager addBookMarkWithUrl:@"www.baidu.com" withTitle:@"百度" withStars:3 withVist:123 withLevel:'A'];
//新建一个新浪的书签
[myBookManager addBookMarkWithUrl:@"www.sina.com" withTitle:@"新浪" withStars:7 withVist:456 withLevel:'B'];
//新建一个搜狐的书签
[myBookManager addBookMarkWithUrl:@"www.souhu.com" withTitle:@"搜狐" withStars:5 withVist:756 withLevel:'C'];
//反复加入
[myBookManager addBookMarkWithUrl:@"www.souhu.com" withTitle:@"搜狐" withStars:5 withVist:756 withLevel:'C'];
//显示所有书签
NSLog(@"所有加入的书签");
[myBookManager showAllBookMark];
//查找
[myBookManager searchWithTitle:@"新浪"];
//删除
[myBookManager removeBookMark:@"百度"];
NSLog(@"删除后的书签");
[myBookManager showAllBookMark];
//排序
[myBookManager sortWithStars];
NSLog(@"排序后的书签");
[myBookManager showAllBookMark];
//改动
[myBookManager modifyTitle:@"新浪" withNewTitle:@"123"];
NSLog(@"改动后的书签");
[myBookManager showAllBookMark];
}
return 0;
}

首先我们天剑三个书签:百度、新浪和搜狐。

书签的内容就是程序中的内容。

然后我们验证添加书签、查找书签、删除书签、书签排序和改动书签的行为方法是否正确。

最后程序的输出是:

2015-07-22 20:15:58.560 3.书签管理器[3083:303] 反复加入
2015-07-22 20:15:58.562 3.书签管理器[3083:303] 所有加入的书签
2015-07-22 20:15:58.563 3.书签管理器[3083:303] 网址:www.baidu.com 标题:百度 星级:3 訪问量:123 权限:A
2015-07-22 20:15:58.565 3.书签管理器[3083:303] 网址:www.sina.com 标题:新浪 星级:7 訪问量:456 权限:B
2015-07-22 20:15:58.565 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.566 3.书签管理器[3083:303] 找了该书签 pos = 1
2015-07-22 20:15:58.568 3.书签管理器[3083:303] 删除后的书签
2015-07-22 20:15:58.568 3.书签管理器[3083:303] 网址:www.sina.com 标题:新浪 星级:7 訪问量:456 权限:B
2015-07-22 20:15:58.569 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.570 3.书签管理器[3083:303] 排序后的书签
2015-07-22 20:15:58.571 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.573 3.书签管理器[3083:303] 网址:www.sina.com 标题:新浪 星级:7 訪问量:456 权限:B
2015-07-22 20:15:58.574 3.书签管理器[3083:303] 改动后的书签
2015-07-22 20:15:58.576 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.577 3.书签管理器[3083:303] 网址:www.sina.com 标题:123 星级:7 訪问量:456 权限:B
Program ended with exit code: 0

和我们预期的是一样的,说明我们的书签管理器的项目功能是实现了。

6.总结

在这个书签管理器中我们有下面几点须要学习的:

1.分析项目需求;

2.找对象,抽象出类。分析类的属性和行为;

3.实现类;

4.验证相关行为或方法是否正确。

书签管理器里面存储的是书签,书签里面存储的是数据。这里我在书签管理器里面设置一个可变数组的行为来存储书签的地址。每次添加一个书签的时候我们就创建一个书签的对象。并把书签的数据写进去。

删除书签的时候就删除该书签在数组中的位置就能够了。

【iOS开发之Objective-C】书签管理器项目的更多相关文章

  1. Android开发之AudioManager(音频管理器)具体解释

    AudioManager简单介绍: AudioManager类提供了訪问音量和振铃器mode控制. 使用Context.getSystemService(Context.AUDIO_SERVICE)来 ...

  2. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  3. 李洪强iOS开发之iOS好文章收集

    李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...

  4. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  5. iOS 开发之 GCD 基础

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  6. iOS开发之MVVM在项目中的应用

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  7. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  8. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  9. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

随机推荐

  1. Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...

  2. MVC4 过滤器(转)

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  3. iTextSharp 合并PDF后,无法删除已经合并的单个文件

    private void MergePDFFiles(string[] fileList, string outMergeFile) { List<PdfReader> readerLis ...

  4. UDP套接字——(DGRAM)

    /*********************程序相关信息********************* * 程序编号:014 * 程序编写起始日期:2013.11.29 * 程序编写完成日期:2013.1 ...

  5. 网络驱动移植之解析Linux网络驱动的基本框架

    内核源码:linux-2.6.38.8.tar.bz2 概括而言,编写Linux网络驱动其实只要完成两件事即可,一是分配并初始化网络设备,二是注册网络设备. 1.分配并初始化网络设备 动态分配网络设备 ...

  6. HUD Text 学习

    使用版本 NGUI_HUD_Text_v1.11 .英语水平差,难免有很多不足之处,忘批评指正.本文为鬼脸苹果原创 HUD Text 的其中一个用途是,涉及到非战斗场景时,你能通过在角色头顶显示文本行 ...

  7. Dragon of Loowater

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=2267" style="color:b ...

  8. C#基础视频教程1 背景知识和安装配置

    安装过程比较简单,用虚拟光驱工具加载ISO文件,然后打开EXE安装即可,主要使用VS2013(VS2015也出来了,但是用的还不算多)     建议设置为深色(比较容易看清)   建议显示行号,不要自 ...

  9. 随机数的生成:给定1-n的随机数生成器randn(),生成1-m的随机数

    1.当m < n时比较简单: 只当randn()生成的数落在1-m上时,就输出,否则继续生成: 2.当m > n时就比较麻烦一点, 基本思路还是和第一种情况是一样的,问题是怎样才能利用ra ...

  10. 静态库与动态库的制作以及程序的动态函数库解析ldd;ldconfig与/etc/ld.so.conf

    静态库的制作步骤: (1)gcc -c mylib.c -o mylib.o (2)ar rc libmylib.a mylib.o 动态库的制作步骤: gcc -shared mylib.c -o ...