iOS_27SplitViewController的简单使用

最终效果图:

主控制器 BeyondViewController

继承自UISplitViewController

//
//  BeyondViewController.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  主控制器,继承自UISplitViewController,左边master控制器是:FoodTypeListCtrl,右边的从控制器是FoodListCtrl

#import <UIKit/UIKit.h>

@interface BeyondViewController : UISplitViewController

@end
//
//  BeyondViewController.m
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  主控制器,继承自UISplitViewController,左边master控制器是:FoodTypeListCtrl,右边的从控制器是FoodListCtrl

#import "BeyondViewController.h"
// 菜系 列表 控制器
#import "FoodTypeListController.h"
// 菜列表 控制器
#import "FoodListController.h"

// 菜系 列表 控制器 定义的协议,目的是:点击了菜系 列表 中的某一行时,告诉代理(即菜列表控制器) 要展示哪一种菜系下面的所有菜
#import "FoodTypeListCtrlDelegate.h"

@interface BeyondViewController () <FoodTypeListCtrlDelegate>

@end

@implementation BeyondViewController
// 重要~~~主控制器充当中间人,先得到FoodTypeListController,并且成为它的代理,得到菜系 列表 的某一行被点击时 对应的菜系对象
//  然后再在FoodTypeListController的代理方法中,得到FoodListController,并将菜系 进一步传递给FoodListController
- (void)viewDidLoad
{
    [super viewDidLoad];
    // 1.先得到Master控制器,即导航控制器,再从导航控制器中得到  FoodTypeListController,并且成为它的代理
    UINavigationController *foodTypeListNav = [self.childViewControllers firstObject];
    FoodTypeListController *foodTypeListCtrl = [foodTypeListNav.childViewControllers firstObject];
    foodTypeListCtrl.delegate = self;

    // 让foodListCtrl成为主控制器的代理,仅仅是监听Master控制器的出现和隐藏,并在foodListCtrl的左按钮上显示相应的提示文字(点击该文字可以展开被隐藏的Master控制器)
    UINavigationController *foodListNav = [self.childViewControllers lastObject];
    FoodListController<UISplitViewControllerDelegate> *foodListCtrl = [foodListNav.childViewControllers firstObject];
    self.delegate = foodListCtrl;
}
// 2. 然后再在FoodTypeListController的代理方法中,得到FoodListController,并将菜系 进一步传递给FoodListController
- (void)foodTypeListController:(FoodTypeListController *)foodTypesVc didSelectedFoodType:(FoodType *)type
{
    UINavigationController *foodListNavi = [self.childViewControllers lastObject];
    FoodListController *foodListCtrl = [foodListNavi.childViewControllers firstObject];
    foodListCtrl.foodType = type;

    [foodListNavi popToRootViewControllerAnimated:YES];
}

@end

SplitViewCtrl的Master主控制器,

继承自表格控制器

FoodTypeListController 【菜系列表】及其代理

//
//  FoodTypeListController.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  SplitViewCtrl的Master主控制器,继承自表格控制器 【菜系列表】

#import <UIKit/UIKit.h>
@protocol FoodTypeListCtrlDelegate;
@interface FoodTypeListController : UITableViewController

// 成员:代理,当点击了某一行时,告诉代理 即点击了哪一种菜系,从而,右边的控制器展示相应的菜名列表
@property (weak, nonatomic) id<FoodTypeListCtrlDelegate> delegate;

@end
//
//  FoodTypeListController.m
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "FoodTypeListController.h"

#import "FoodType.h"

#import "FoodTypeListCtrlDelegate.h"
@interface FoodTypeListController ()
// 成员:数组,保存着从plist中加载的所有的从字典一一转成对象的FoodType
@property (strong, nonatomic) NSArray *foodTypesArr;
@end

@implementation FoodTypeListController
// getter访问时才加载,懒加载
- (NSArray *)foodTypesArr
{
    if (_foodTypesArr == nil) {
        // 经典,一句话将参数所对应的Plist文件中的字典数组,转成 该类的对象数组
        _foodTypesArr = [FoodType objArrFromPlistName:@"food_types.plist"];
    }
    return _foodTypesArr;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.title = @"菜系";
    // 默认选择第0行,调用自己的方法,给其传递数据模型
    [self.tableView selectRowAtIndexPath:kIndexPathZero animated:YES scrollPosition:UITableViewScrollPositionTop];
    // 让第0行,显示选中状态,需配合覆盖掉系统默认的方法:viewWillAppear
    [self tableView:self.tableView didSelectRowAtIndexPath:kIndexPathZero];
}
// 取消系统默认的一些 事件,让第0行,显示选中状态
- (void)viewWillAppear:(BOOL)animated
{
 // do nothing...
}

#pragma mark - 数据源方法
// 多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.foodTypesArr.count;
}
// 每行显示的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"FoodType";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    // 模型数组中取出对应行的模型
    FoodType *type = self.foodTypesArr[indexPath.row];
    // 设置独一无二的内容
    cell.textLabel.text = type.name;
    // 返回cell
    return cell;
}
#pragma mark - 代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 如果 代理(就是右边的从控制器)需要,才告知 当前选择了哪一个菜系
    if ([self.delegate respondsToSelector:@selector(foodTypeListController:didSelectedFoodType:)]) {
        FoodType *type = self.foodTypesArr[indexPath.row];
        [self.delegate foodTypeListController:self didSelectedFoodType:type];
    }
}

@end

定义好的协议

//
//  FoodTypeListCtrlDelegate.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <Foundation/Foundation.h>
@class FoodType;
@protocol FoodTypeListCtrlDelegate <NSObject>

@optional
// 当点击了某一行时,告诉代理 即点击了哪一种菜系,从而,右边的控制器展示相应的菜名列表
- (void)foodTypeListController:(FoodTypeListController *)ctrl didSelectedFoodType:(FoodType *)foodType;

@end

FoodListController

SplitViewCtrl的从控制器,继承自表格控制器

展示的是某一菜系下所有的菜【菜的列表】

//
//  FoodListController.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  SplitViewCtrl的从控制器,继承自表格控制器  某一菜系下所有的【菜的列表】
//  点击左边菜系列表控制器中的某一行时,本控制器将展示该菜系下的所有菜

#import <UIKit/UIKit.h>
@class FoodType;
@interface FoodListController : UITableViewController

// 数据源,根据传入的菜系,通过它的idstr,拼凑出新的plist名称,加载,转成Food模型对象数组
@property (strong, nonatomic) FoodType *foodType;
@end
//
//  FoodListController.m
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "FoodListController.h"

#import "FoodDetailController.h"
#import "Food.h"
#import "FoodCell.h"
#import "FoodType.h"

// 成为UISplitViewControllerDelegate的代理,目的是监听其显示和隐藏方法,从而控制leftBarButtonItem的显示和隐藏
@interface FoodListController ()<UISplitViewControllerDelegate>
@property (strong, nonatomic) NSArray *foodsArr;
@end

@implementation FoodListController

- (void)viewDidLoad
{
    [super viewDidLoad];

}

// 重要~~~拦截setterFoodType方法,设置标题,从对应的Plist加载数据,并转成对象数组,刷新表格
- (void)setFoodType:(FoodType *)foodType
{
    _foodType = foodType;

    NSString *filename = [NSString stringWithFormat:@"type_%@_foods.plist", foodType.idstr];
    // 经典,一句话将参数所对应的Plist文件中的字典数组,转成 该类的对象数组
    self.foodsArr = [Food objArrFromPlistName:filename];
    self.title = foodType.name;
    if (self.isViewLoaded) {
        // 默认让tableView 滚动到第 0 行
        [self.tableView scrollToRowAtIndexPath:kIndexPathZero atScrollPosition:UITableViewScrollPositionTop animated:YES];
        // 刷新表格
        [self.tableView reloadData];
    }
}
#pragma mark - SplitViewCtrl的代理方法
// 即将显示 Master主控制器
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    self.navigationItem.leftBarButtonItem = nil;
}
// 即将隐藏 Master主控制器
- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
    barButtonItem.title = @"菜系";
    self.navigationItem.leftBarButtonItem = barButtonItem;
}

#pragma mark - 数据源方法
// 多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.foodsArr.count;
}
// 高度封装了FoodCell,控制器知道得很少
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    FoodCell *cell = [FoodCell cellWithTableView:tableView];

    cell.food = self.foodsArr[indexPath.row];

    return cell;
}
#pragma mark - 代理方法
// cell 行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100;
}
// 选中某一行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 点击那行  对应的模型
    Food *food = self.foodsArr[indexPath.row];
    FoodDetailController *detailVc = [[FoodDetailController alloc] init];
    // 传递数据模型,内部会拦截
    detailVc.food = food;
    [self.navigationController pushViewController:detailVc animated:YES];
}

@end

WebView展示某一道 菜 的详情

//
//  FoodDetailController.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  点击菜列表控制中的某一行,来到这,显示该道菜的详细信息,直接用webView展示

#import <UIKit/UIKit.h>
@class Food;
@interface FoodDetailController : UIViewController

// 数据源,要显示哪道菜
@property (strong, nonatomic) Food *food;
@end
//
//  FoodDetailController.m
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  点击一行,来到这,显示该道菜的详细信息,直接用webView展示

#import "FoodDetailController.h"
#import "Food.h"

@interface FoodDetailController ()
@property (weak, nonatomic) UIWebView *webView;
@end

@implementation FoodDetailController
// 让weibView就是控制器的view
- (void)loadView
{
    UIWebView *webView = [[UIWebView alloc] init];
    // bounds就是屏幕的全部区域,applicationFrame就是app显示的区域,不包含状态栏
    webView.frame = [UIScreen mainScreen].applicationFrame;
    // 随着屏幕的旋转,宽高自动伸缩
    webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.view = webView;
    // 成员变量,记住,目的是 避免强转
    self.webView = webView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 导航栏标题
    self.title = self.food.name;
    // 重点~~~拼接本地url,注意:如果在沙盒创建真实的文件夹,那么加载文件时,要加上文件夹名
    NSString *fileName = [NSString stringWithFormat:@"Html/food/%@.html", self.food.idstr];
    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:fileName  withExtension:nil]];
    [self.webView loadRequest:request];
}
@end

模型Model

//
//  Food.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  模型:一种菜肴 Food 对应plist文件里面的一个字典

#import <Foundation/Foundation.h>

@interface Food : NSObject

// 必须与plist文件中 字典的key 一模一样
// id
@property (copy, nonatomic) NSString *idstr;
// 菜名
@property (copy, nonatomic) NSString *name;
// 小图标url
@property (copy, nonatomic) NSString *imageUrl;
// 网页的url
@property (copy, nonatomic) NSString *url;
// 本道菜预计耗时多长
@property (copy, nonatomic) NSString *time;
// 制作难度多大
@property (copy, nonatomic) NSString *diff;

@end
//
//  FoodType.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  模型:一种菜系 FoodType 对应plist文件里面的一个字典

#import <Foundation/Foundation.h>

@interface FoodType : NSObject
// ID
@property (copy, nonatomic) NSString *idstr;
// 菜系 名称:如粤菜 川菜 家常菜
@property (copy, nonatomic) NSString *name;

@end

封装的一个Cell     View

//
//  FoodCell.h
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  自定义cell,一个cell 展示一个food模型里面的数据,传入tableView实例化cell的目的是封装得最彻底,让控制器作最少的事,知道得最少

#import <UIKit/UIKit.h>
@class Food;
@interface FoodCell : UITableViewCell

// 数据源模型,提供数据给内部的子控件们显示,内部会拦截setter方法
@property (strong, nonatomic) Food *food;
// 传入tableView实例化cell的目的是封装得最彻底,让控制器作最少的事,知道得最少
+ (instancetype)cellWithTableView:(UITableView *)tableView;

@end
//
//  FoodCell.m
//  27_SplitViewCtroller
//
//  Created by beyond on 14-8-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "FoodCell.h"

#import "Food.h"
#import "UIImageView+WebCache.h"

@interface FoodCell()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *descLabel;
@end

@implementation FoodCell

// 传入tableView实例化cell的目的是封装得最彻底,让控制器作最少的事,知道得最少
+ (instancetype)cellWithTableView:(UITableView *)tableView
{
    // cellID必须和xib中的一模一样
    static NSString *cellID = @"FoodCell";
    FoodCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        // 从xib创建
        cell = [[[NSBundle mainBundle] loadNibNamed:cellID owner:nil options:nil] lastObject];
        // 右边是箭头
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    return cell;
}
// 数据源模型,提供数据给内部的子控件们显示,内部会拦截setter方法
- (void)setFood:(Food *)food
{
    _food = food;

    // 小图标
    [self.iconView setImageWithURL:[NSURL URLWithString:food.imageUrl] placeholderImage:[UIImage imageNamed:@"timeline_image_placeholder"]];
    // 菜名
    self.nameLabel.text = food.name;
    // 子标题
    self.descLabel.text = [NSString stringWithFormat:@"难度:%@  时长:%@", food.diff, food.time];

}
@end

XIB

时间: 2024-11-03 18:46:59

iOS_27SplitViewController的简单使用的相关文章

C# Ping 简单使用

编程过程中,有时候需要判断主机是否在线,最简单的方法就是使用Windows的Ping命令看看能否ping通.看到网上很多文章,说用C#去调用windows的ping.exe,然后解析返回的字符串.我觉得这种方式太麻烦了,就做一下简单判断,不想弄那么麻烦. 查了一下,C#专门提供了一个Ping类,与Windows下的ping命令类似: 命令空间: System.Net.NetworkInformation; 使用方法: bool online = false; //是否在线 Ping ping =

自动生成简单四则运算的C语言程序

该程序是在博客园里面找的,具体是谁的找了半天没找到,无法提供它原本的链接.由于自己写的过于简单,且有一些功能暂时无法实现,所以就找了一个来应付作业,望原谅.在这个程序的源码中我改了一个错误的地方,源码中有这样一个随机数发生器的初始化函数的语句:"srand((unsigned)time(NULL))".srand函数是随机数发生器的初始化函数.但是正确的写法应该是:srand(unsigned( time(NULL))):为了防止随机数每次重复,常常使用系统时间来初始化,即使用time

Mysql的锁机制与PHP文件锁处理高并发简单思路

以购买商品举例: ① 从数据库获取库存的数量. ② 检查一下库存的数量是否充足. ③ 库存的数量减去买家购买的数量(以每个用户购买一个为例). ④ 最后完成购买. 仅仅这几行逻辑代码在并发的情况下会出现问题,自己可以想象一下. 这里暂时就不测试了,下面会针对并发的处理给出测试结果. 创建表: CREATE TABLE `warehouse` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `stock` int(11) NOT NULL

Winfrom 简单的安卓手机屏幕获取和安卓简单操作

为啥我要做这个东西了,是因为经常要用投影演示app ,现在有很多这样的软件可以把手机界面投到电脑上 ,但都要安装,比如说360的手机助手,我又讨厌安装,于是就自己捣鼓了下 做了这个东西, 实现了以下简单功能   1.屏幕获取(因为是截图方式获取的,所以有点卡顿) 2.实现点击功能,并在点击的时候出现一个手势图标,方便用户观看 3.实现简单的滑动功能 4.实现在界面上画图功能 5.实现拖拽安装apk功能 操作说明:鼠标左边 模拟手机点击,中键停止/开始刷新界面(画图的时候不能刷新),右键去掉画图内

iOS instruments之ui automation的简单使用(高手绕道)

最近使用了几次instruments中的automation工具,现记录下automation的简单使用方法,希望对没接触过自动化测试又有需求的人有所帮助.  UI 自动测试是iOS 中重要的附加功能,它由名为"Automation"的新的工具对象支持.Automation工具的脚本是用JavaScript语言编写,主要用于分析应用的性能和用户行为,模仿/击发被请求的事件,利用它可以完成对被测应用的简单的UI测试及相关功能测试. 一. 简单的录制脚本 打开xcode,这里用我为我家亲爱

Android ExpandableListView 带有Checkbox的简单应用

expandablelistview2_groups.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&qu

Android ExpandableListView的简单应用

Expandablelistview1Activity.java package com.wangzhu.demoexpandablelistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widg

一个简单的主机管理模拟程序

最近写的一个小练习,主要是把前面学的东西整合一下.写了一个简单的主机管理界面,主要是练习以下知识点: Session和Cookie进行登录验证(装饰器) 数据库的基本操作 (单表,1对多,多对多) Form的简单使用实现验证 Bootstrap模板写个简单界面 自定义分页 信号,中间件,CSRF,模板语言,JavaScript,AJAX等等 界面比较low,毕竟不是专业的. 附件里面是Django的源代码,3个文件放在一起winrar解压就可以打开

简单介绍一下vue2.0

Vue Vue是用于构建用户界面的渐进框架.作者尤雨熙特别强调它与其他的框架不同,Vue是渐进式的框架,可以逐步采用,不必一下就通过框架去重构项目. 另外Vue的核心库只专注于视图层,这样就更容易与其他库或现有项目进行集成,也更灵活. Vue在兼容性上不支持IE8以下版本的浏览器,用到了ECMAScript 5的功能,所有支持ECMAScript 5的浏览器都没问题,像这些: 安装 如果你已经熟悉并安装webpack那可以直接装一个CLI版即命令行工具,快速方便. $ npm install -