引用AFNetWorking三方要在倒数第三个文件, 第222行加上@”text/html”
AppDelegate.h
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "RootViewController.h"
#import "SaveTool.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)dealloc {
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
RootViewController *rootVC = [[RootViewController alloc] init];
UINavigationController *NAVC = [[UINavigationController alloc] initWithRootViewController:rootVC];
self.window.rootViewController = NAVC;
[rootVC release];
[NAVC release];
[SaveTool isHaveFolder];
return YES;
}
SaveTool.h
#import <Foundation/Foundation.h>
#import "Movie.h"
typedef NS_ENUM(NSUInteger, SaveToolType) {
SaveToolMovie,
SaveToolActivity,
SaveToolCinema,
};
@interface SaveTool : NSObject
// 用来判断文件夹是否存在, 如果没有文件夹, 就创建一个, 如果有不做任何操作
+ (void)isHaveFolder;
+ (BOOL)isHaveMovieInPlist:(Movie *)movie;
+ (void)saveMovieToPlist:(Movie *)movie;
+ (void)cancleMovieInPlist:(Movie *)movie;
+ (BOOL)isHaveInFile:(id)object type:(SaveToolType)type;
@end
SaveTool.m
#import "SaveTool.h"
@implementation SaveTool
+ (void)isHaveFolder {
// 1. 找沙盒路径
NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 2. 拼接电影的文件夹名
NSString *movieFile = [sandBoxPath stringByAppendingPathComponent:@"Movie"];
// 创建一个文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 通过管理者调用方法, 根据路径判断文件夹是否存在
if (![manager fileExistsAtPath:movieFile]) {
// 创建文件夹
[manager createDirectoryAtPath:movieFile withIntermediateDirectories:YES attributes:nil error:nil];
}
// NSLog(@"%@", movieFile);
}
+ (BOOL)isHaveMovieInPlist:(Movie *)movie {
NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"Movie/movie.plist"];
// 反归档
NSArray *movieArr = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
// 遍历
for (Movie *temp in movieArr) {
if ([temp.movieId isEqualToString:movie.movieId]) {
return NO;
}
}
return YES;
}
+ (void)saveMovieToPlist:(Movie *)movie {
NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"Movie/movie.plist"];
// 直接归档会覆盖掉之前的数据, 所以先进行反归档, 然后添加进去之后再进行归档操作
NSMutableArray *movieArr = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
if (movieArr == nil) {
// 如果为空, 先进行初始化
movieArr = [NSMutableArray array];
}
[movieArr addObject:movie];
// 归档
[NSKeyedArchiver archiveRootObject:movieArr toFile:docPath];
NSLog(@"%@", docPath);
}
+ (void)cancleMovieInPlist:(Movie *)movie {
NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"Movie/movie.plist"];
NSMutableArray *movieArr = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
// 遍历之后移除相应的对象
for (Movie *temp in movieArr) {
if ([temp.movieId isEqualToString:movie.movieId]) {
// 移除
[movieArr removeObject:temp];
break;
}
}
// 归档
[NSKeyedArchiver archiveRootObject:movieArr toFile:docPath];
}
+ (BOOL)isHaveInFile:(id)object type:(SaveToolType)type {
NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
switch (type) {
case SaveToolMovie: {
// 拼接电影的文件夹路径
NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"Movie/movie.plist"];
NSArray *movieArr = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
Movie *movie = object;
for (Movie *temp in movieArr) {
if ([temp.movieId isEqualToString:movie.movieId]) {
return NO;
}
}
} break;
default:
break;
}
return YES;
}
@end
RootViewController.h
#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController
@end
RootViewController.m
#import "RootViewController.h"
#import "AFNetworking.h"
#import "Movie.h"
#import "MovieDetailViewController.h"
@interface RootViewController ()<UITableViewDataSource, UITableViewDelegate>
@property(nonatomic, retain)NSMutableArray *movieArr;
@property(nonatomic, retain)UITableView *tableView;
@end
@implementation RootViewController
- (void)dealloc
{
[_movieArr release];
[_tableView release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self createData];
// [self network];
self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];self.tableView.dataSource = self;
self.tableView.delegate = self;
[self.view addSubview:self.tableView];
[_tableView release];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuse"];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MovieDetailViewController *MDVC = [[MovieDetailViewController alloc] init];
[self.navigationController pushViewController:MDVC animated:YES];
[MDVC release];
MDVC.movie = self.movieArr[indexPath.row];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse" forIndexPath:indexPath];
Movie *movie = self.movieArr[indexPath.row];
cell.textLabel.text = movie.movieName;
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.movieArr.count;
}
- (void)network {
// 检测网络情况
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 开始检测
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
}];
[manager stopMonitoring];
}
- (void)createData {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/movielist.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
NSDictionary *dic = responseObject;
self.movieArr = [NSMutableArray array];
for (NSDictionary *tempDic in dic[@"result"]) {
Movie *movie = [[Movie alloc] init];
[movie setValuesForKeysWithDictionary:tempDic];
[self.movieArr addObject:movie];
[movie release];
}
[self.tableView reloadData];
// NSLog(@"%ld", self.movieArr.count);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
MovieDetailViewController.h
#import <UIKit/UIKit.h>
@class Movie;
@interface MovieDetailViewController : UIViewController
@property(nonatomic, retain)Movie *movie;
@end
MovieDetailViewController.m
#import "MovieDetailViewController.h"
#import "Movie.h"
#import "SaveTool.h"
@interface MovieDetailViewController ()
@property(nonatomic, retain)UILabel *label;
@property(nonatomic, retain)UIScrollView *scrollView;
@end
@implementation MovieDetailViewController
- (void)dealloc
{
[_label release];
[_scrollView release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.title = self.movie.movieName;
// 因为按钮上的子显示的是当前model的收藏情况, 所以需要先进行反归档, 如果存在就显示已收藏, 不存在显示收藏
if ([SaveTool isHaveInFile:self.movie type:SaveToolMovie]) {
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"收藏" style:UIBarButtonItemStylePlain target:self action:@selector(click:)];
} else {
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"已收藏" style:UIBarButtonItemStylePlain target:self action:@selector(click:)];
}
self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)];
[self.view addSubview:self.label];
[_label release];
self.label.text = @"专车新政的影响或许才刚刚开始。上周五,交通部公布了“专车新政”,神州专车在几大品牌中或成最大受益者,立即在市场上公布了几项重大决定。先是宣布手握10亿美元,计划在营销、服务上继续发力,欲做专车中的苹果;紧接着面向全国招聘万名退伍军人担任专车司机;更引人注意的是,神州专车还斥资2.1亿美元收购神州租车逾5%股份。";
self.label.numberOfLines = 0;
[self.label sizeToFit];
NSLog(@"%g", self.label.frame.size.height);
#pragma mark - 在label之后就可以写自适应高度scrollView了
// NSLog(@"%@", self.movie.movieName);
}
- (void)click:(UIBarButtonItem *)button {
if ([button.title isEqualToString:@"已收藏"]) {
// 有一个提示窗口, 显示已收藏, 不需要重复收藏, 再点击就是移出收藏
[SaveTool cancleMovieInPlist:self.movie];
button.title = @"收藏";
} else {
// 收藏进行归档
[SaveTool saveMovieToPlist:self.movie];
button.title = @"已收藏";
}
NSLog(@"%@", button.title);
}
Movie.h
#import <Foundation/Foundation.h>
@interface Movie : NSObject<NSCoding>
@property(nonatomic, copy)NSString *movieId;
@property(nonatomic, copy)NSString *movieName;
@property(nonatomic, copy)NSString *pic_url;
@end
Movie.m
#import "Movie.h"
@implementation Movie
- (void)dealloc
{
[_movieId release];
[_movieName release];
[_pic_url release];
[super dealloc];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.movieId forKey:@"movieId"];
[aCoder encodeObject:self.movieName forKey:@"movieName"];
[aCoder encodeObject:self.pic_url forKey:@"pic_url"];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.movieId = [aDecoder decodeObjectForKey:@"movieId"];
self.movieName = [aDecoder decodeObjectForKey:@"movieName"];
self.pic_url = [aDecoder decodeObjectForKey:@"pic_url"];
}
return self;
}
@end