苹果6s手势功能怎么用解锁方式

iOS各种view跳转的方式,和数据的传输
核心提示:rd实现页面跳转,简单的数据传递由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候...
(4.4.1)使用storyboard实现页面跳转,简单的数据传递
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知,在storyboard中,界面的跳转是通过segue来实现的,利用它,省去了方法内写入跳转的代码。
一 视图跳转
《StoryBoard下的视图跳转》
我们知道:segue共有三种类型:push,modal,和custom。如下图://01
简单说下这三个的作用:使用导航栏压进新的控制器(push),模态的加载视图控制器(modal),自定义(custom)。
好了,废话少说,现在开始我们的旅行。
1,首先建立一个Single View模板的项目,记得勾选上storyboard。然后打开它,在rootViewController(也就是我们的主视图)添加一些label和一个button。
2,在右边的库中拖入一个ViewController,也添加一个Label。具体如下图所示://02
3,选中button,右键(或control+鼠标左键)拖拽到第二个ViewController中,选择:Modal,然后记得save。这个时候,运行模拟器,点击button,你会发现成功跳转到了第二个界面。我们没有在代码区做任何操作,甚至连button和第二个ViewController都没有创建,确实就是这么的简单。//03
好了,到了这里,简单说一下storyboard下,利用segue界面跳转一共有两种方式:
第一种就是以上我的例子,利用button组件,拖拽添加segue,直接运行就可以用。
第二种是利用ViewController与ViewController之间,拖拽添加segue。不过,这种方法就需要在相应需要跳转的方法内写入代码,手动去设置它的跳转。
4,把刚才例子设置button的segue删除(右键,点X),一切恢复了最初时的状态,我们给buttom添加一个点击的方法,然后在ViewController.m中实现此方法,在方法体内写入这样的代码://04
5,注意看方法参数:@ second ,这个second是我自命名的一个标示符,一会你就会遇到。
6,save保存,打开storyboard,选中rootViewController,右键拖拽到第二个ViewController,在弹出的界面同样选择:modal。//05
7,打开这个segue的设置页面:设置其identifier为second,就是我在代码中的那个自命名参数。
8,save保存,运行模拟器,你会惊奇的发现,实现了同样的跳转。
到现在为止,我们一共用两种简单的方式实现了视图的跳转:1是设置button的segue,2是设置viewcontroller与viewcontroller之间的segue,只是后者需要在代码中手动管理跳转。
看似很简单的事情,却让我耽误一些时间,主要是因为我在网上看的好多例子都是以UINavigationController为rootviewController(这样省事省时,跳转后还可以利用系统为我们创建的返回按钮返回到rootViewController),然后用button拖拽到第二个视图时选择的push,由于当时不理解push相关的类型含义,所以在写的时候,我总是选择push,造就了点击后无法跳转。现在终于明朗了,记录下来,供不明白的同学学习。
----------------------------------------------------------------------------------------------------
//根据 segueIdentifier跳转界面
[self performSegueWithIdentifier:@ GotoTwo
sender:self];
//以modal 方式跳转
[self presentModalViewController:nil animated:YES];
//压进一个viewcontroller
[self.navigationController pushViewController:nil animated:YES];
//弹出一个viewcontroller
相当与返回上一个界面
[self.navigationController popViewControllerAnimated:YES];
// 以 modal跳转的返回方法
[self dismissModalViewControllerAnimated:YES];
-----------------------------------------------------------------------------------------------------再写一下关于segue三个类型的详解:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在storyboard中,segue有几种不同的类型,在iphone和ipad的开发中,segue的类型是不同的。在iphone中,segue有:push,modal,和custom三种不同的类型,这些类型的区别在与新页面出现的方式。而在ipad中,有push,modal,popover,replace和custom五种不同的类型。
modal 最常用的场景,新的场景完全盖住了旧的那个。用户无法再与上一个场景交互,除非他们先关闭这个场景。是在viewController中的标准切换的方式,包括淡出什么的,可以选切换动画。Modalview:就是会弹出一个view,你只能在该view上操作,而不能切换到其他view,除非你关闭了modalview.Modal View对应的segue type就是modalsegue。*Modal:Transition to another scenefor the purposes of completing atask.当user在弹出的modalview里操作完后,就应该dismiss the modal viewscene然后切换回the originalview.
pushPush类型一般是需要头一个界面是个NavigationController的。是在navigation ViewController中下一级时使用的那种从右侧划入的方式*Push:Create a chain of scenes wherethe user can move forward or back.该segue type是和navigationviewcontrollers一起使用。 popover(iPadonly)popover 类型,就是采用浮动窗的形式把新页面展示出来*Popover(iPad only):Displays thescene in a pop-up “window” over top of the currentview. Replace (iPadonly):替换当前scene,Replace the current scene withanother. This is used in some specialized iPad viewcontrollers(e.g. split-view controller). custom就是自定义跳转方式啦。*Custom:Used for programming acustomtransition between scenes.在Storyboard中使用自定义的segue类型
参考/?p=72
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
《Xib下的视图跳转》
现在说一下,没有使用Storyboard,直接创建xib时的页面跳转,其实也很简单,只要理解了,都不是问题。我也是从java刚转过来,起初感觉很不适应,但是现在发现interfacebuilder真的是太强大了。
1,创建一个项目,我用的是EmptyApplication模版,这种模版创建出来的项目只包含一个Appdelegate.h和Appdelegate.m文件,rootviewController需要我们自行创建。(注意:最新的版本,apple把MainWindow.xib文件取消了,所以无法打开xib查看包含的图标)此时运行模拟器只会显示空白的界面。好了,File-newFile创建一个Object-C class,打开后,subclass of选择默认的UIViewController,注意,需要勾选上WithXIB for user interface,不然一会无法创建主视图。
2,创建好后,打开其xib文件,简单添加一些button组件。此时保存运行程序还是无法显示我们创建的RootViewController。【有时如果你在项目清单下的userinterface 选择此MainViewController运行后台还会报:Applications are expected to have a root viewcontroller at the end of applicationlaunch的错误,原因都是项目的Delegate无法发现一个rootViewContrller】所以这就需要我们手动在AppDelegate中让它们关联起来。
AppDelegate.h
AppDelegate.m
[self.viewController就是我们在.h文件中声明的]
3,好了,保存后,这个时候运行就能显示我们的界面了~同样也很简单吧!好了,我们现在参照以上的方法,再创建一个SecondViewController(记得勾选xib),然后我们给rootviewcontroller视图的button添加一个事件方法,可以让它点击后跳转到SecondViewController。
(首先创建了一个SecondViewController并实例化,intitWithNibName的参数一定要正确写控制器配对的xib文件的名称,调用presentModalViewController:controller就可以跳转啦。)
发现了把,其实都挺简单的,本来可以创建single ViewApplication模板的,这样就省去创建rootViewController和在Delegate中写那些代码了,我这样也就是让大家感受一下,xib,delagate,stroyboard之间的区别和联系,都尝试一下,你们就会明白他们之间的机制,至少可以会写界面和跳转的方法啦。哈哈,有什么问题大家一起交流,我也是初学者,可以给我留言噢。~~~
二 页面传值
方法一使用segue传递数据,继续上面的项目例子。
1,在rootViewController声明一个UITextField并与storyboard关联上。File-add添加一个SecondViewController(继承UIViewController),然后在keyboard第二个viewcontroller的属性设置其class关联。同样在SecondViewController声明一个UITextField并关联。如图所示://06
2,然后在rootViewController.m的文件中覆盖名称为:prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender的方法,并写入如下语句,如图://07
3,我们获取了主视图的文本框内容,并通过segue的方法发送了出去,rtyNSString * 类型,名称为data的字符串,然后在其.m文件中的-(void)viewDidLoad方法中写入如下代码://08
注意:发送数据时,[send setValue:msg forKey:@ data ];这个 data 名称一定要与跳转后界面的声明的类型对象的命名一致,不然的话,跳转后的界面是收不到传递的值的。
方法二,使用notification广播实现视图跳转传递数据,继续上面的项目展开。
广播机制分为:注册----发送------------接收(接收方),具体请看一下代码。
1,在要发送数据的视图页面.m文件处理发送逻辑的方法里注册+发送
notificationWithName:参数的值是自己定义,接收方以此名称为接收标识。2,在跳转后,接收数据视图页面.m文件中处理逻辑的方法里 接收
注意:如果注册的notification在目标视图没有收到或名称写错,目标视图的相关方法就不会执行
国外参考论坛【传送门】//on-objective-c-delegates-and-nsnotification-objects/
方法三,通过Delegate委托传递数据
此方法我测试完后,感觉不是太好用,有一些局限性,相当于自定义读取方法:无非是在A对象里保存了一个B对象的指针,然后在A的某个函数里去设置B对象某个属性的值。
具体看教程把。
1,首先add a File--
Objective-Cprotocol,然后声明一个传递数值的方法:
2,然后在要发送数据的视图的.h文件下声明一个自定义的delegate
3,在要发送数据的视图的事件处理方法里声明一个secondViewController实例,然后赋值给delegate,同时执行协议的 passValue方法 4,然后在接收数据视图(secondViewController).h文件实现自定义协议 5,在接收数据视图(secondViewController).m文件中实现协议中的passValue方法:
至此,大功告成,打印输出会显示你在第一个界面发送的数据,但是我把此数据赋值于页面的UITextField对象,但是此对象得到的值总是null,无法在界面展示出来,我也很苦恼,什么方法都尝试完了,发现此接收方法总是会在ViewDidLoad方法之后执行,并且方法体内设置UITextField任意值都无法成功。目前总结是,以上value只是对视图1对象赋值时的一个指针引用,出了方法范围,就无效了。所以在方法体内打印都是有数据的,出了方法体,就没有持有的引用了。
具体原因有待考察。iOS开发——使用delegate进行消息传递
iOS开发中,界面之间传递消息或者数据是最基本的一种需求,我们可以使用很多方法来实现这种需求,比如在头文件中暴露一个属性、比如使用notification等等。今天我们要来介绍另一种方式:使用delegate传递消息。
delegate称为委托,同时也是一种代理设计模式。使用委托避免了类与类的耦合度过高。利用委托赋值更加安全可控,委托赋值在不暴露自己类的属性的前提下就可以对自己进行赋值。
在iOS中委托通过协议@protocol来实现,在协议中所声明的方法,不需要在协议中有实现的方法,是由它的实现类来实现(该类需要在头文件中包含&协议名&)。&协议&和&委托&是两个不一样的概念,因为我们在看代码的时候总是会看到他们出现在一起。但不能说,delegate就是protocol,delegate是一种架构模式。举个例子什么是&委托&:比如我在开车,但是开车不能看短信,所以我就叫车里的朋友帮我看短信,这样我就可以正常的开车了。当朋友看完短信内容后,就告诉我是什么内容。这就是委托,朋友就是我的委托对象。&协议&protocol是用来定义对象的属性和行为,类似于C++中的虚函数。其中有两个关键字@required和@optional,前者表示必须要实现的方法,后者是可选的方法。
使用delegate常用在两种情况下:
*两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A;
*控制器(ViewController)与控制器(ViewController)之间的传值,从A跳转到B,再从B返回到A时需要通知A更新UI或者是做其他的事情,这时候就用到了代理(delegate)传值。
tips:如果没有在@protocol中显式的写上@required或者@optional,那么默认就是@required(必需的)的。为了不引起歧义,最好显式的写上@required或@optional。
通常一个delegate的使用过程需要经过5步:
(1)创建一个
(2)委托者声明一个delegate;
(3)委托者调用delegate内的方法(method);
(4)被委托者设置delegate,以便被委托者调用;
(5)被委托者实现delegate所定义的方法;
下面我通过1个实例来演示使用delegate传递数据,代码上传至:/chenyufeng1991/iOS-Delegate 中的Delegate01.
(1)首先程序是基于storyboard来构建的,界面布局如下:在界面返回的时候将会传递数据。
(2)新建一个Protocol,作为我们的协议,里面可以声明一些方法。如图:
ProtocolDelegate里面的实现如下:
//实现一个protocol;
可以理解为中的接口
@protocol ProtocolDelegate
// 必须实现的方法
// 可选实现的方法
- (void)function1;
- (void)function2;
- (void)function3;
(3)我首先来实现第二个界面,在第二个界面的头文件.h中需要声明一个protocol,在该protocol中声明的方法可以在第一个界面中实现,并在第二个界面中进行调用。这是数据传递的关键。
// 新建一个协议,协议的名字一般是由&类名+Delegate&
在该协议中声明的方法,在第一个界面中实现,在该界面中调用;
@protocol ViewControllerBDelegate
- (void)sendValue:(NSString *)
@interface ViewControllerB : UIViewController
//这里的delegate要设置在.h中;
@property (weak, nonatomic) id
(4)在第二个界面的实现文件中实现如下:在点击返回键的时候调用协议中的方法,
#import &ViewControllerB.h&
//第二个界面;
@interface ViewControllerB ()
@property (strong, nonatomic) IBOutlet UITextField *textF
@implementation ViewControllerB
- (IBAction)backAction:(id)sender{
//界面跳转的时候调用该方法;
[self.delegate sendValue:self.textField.text]; // 通知执行协议方法
//返回传递消息;
[self.navigationController popViewControllerAnimated:YES];
(5)下面来实现第一个界面ViewController.m:
#import &ViewController.h&
#import &ProtocolDelegate.h&
#import &ViewControllerB.h&
//第一个界面;
@interface ViewController ()
@implementation ViewController
//因为是基于storyboard的segue来构建,当界面跳转时,自动回调该方法;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
ViewControllerB * = segue.destinationViewC
[vc setDelegate:self];
// 这里实现B控制器的协议方法
- (void)sendValue:(NSString *)value{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@&成功& message:value delegate:nil cancelButtonTitle:@&确定& otherButtonTitles:nil, nil];
[alertView show];
//该方法是ProtocolDelegate中的@required方法;
- (void)execute{
- (IBAction)pressed:(id)sender {
NSLog(@&1111&);
(6)运行效果如下:
上面的demo是基于storyboard。由于有些项目是基于nib文件构建的,我下面来演示一下使用nib文件时的注意点。
(1)删除原来的main.storyboard,新增两个nib文件,分别绑定对应的ViewController。我推荐使用navigationBar,所以在AppDelegate.m中的实现如下:
#import &AppDelegate.h&
#import &ViewController.h&
@interface AppDelegate ()
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[ViewController alloc] init];
self.naviController = [[UINavigationController alloc] initWithRootViewController:self.window.rootViewController];
[self.window addSubview:self.naviController.view];
[self.window makeKeyAndVisible];
return YES;
(2)在第二个界面中主要修改如下,删除prepareForSegue方法,在按钮的点击方法中实现:
- (IBAction)pressed:(id)sender {
//如果项目本身是根据nib文件构建的,就使用下面的方式绑定delegate,并跳转;
ViewControllerB *vb
= [[ViewControllerB alloc] initWithNibName:@&ViewControllerB& bundle:[NSBundle mainBundle]];
vb.delegate
[self.navigationController pushViewController:vb animated:true];
然后运行效果同上。不同之处也就是在ViewController绑定delegate处有不同。
总结,Delegate委托属于程序架构层面上,是相对比较高的层次,如果我们能够熟练使用delegate,就能有效降低程序耦合度,提高代码可读性。!如何优雅地进行页面间的跳转(iOS) - 推酷
如何优雅地进行页面间的跳转(iOS)
在你的开发过程中,是否遇到过如下的需求:
在tableView类型的展示列表中,点击每个cell中人物头像都可以跳转到人物详情,可参见微博中的头像,同理包括转发、评论按钮、各种链接及linkcard。
跳转到任意页面
产品要求,某个页面的不同banner图,点击可以跳转到任何一个页面,可能是原生的页面A、页面B,或者是web页C。
在web页面,可以跳转到任何一个原生页面。
在远程推送中跳转到任意指定的页面。
以上2种需求,我想大多数开发者都遇到过,并且可以实现这种功能。毕竟,这是比较基础的功能。但是代码未必那么优雅。
一般处理办法
,一般初学者会用target或者block等方法在tableView的代理方法拿到事件,并把要执行的跳转写到controller里。功能是可以实现的,但问题是这种cell及相似的cell(布局有些变化,或者多几个少几个控件)一般出现在多个页面。这样的话相同的代码就会出现在多个地方。就算把跳转方法抽取出来写成category,但是target或者block总是每个地方都要写的。
,初级的方法是每个地方写一坨判断及跳转,高级一些是抽取出来写在基类或者category。
优雅的解决办法
纵观上面各种情况,总结起来就是一句话,
在任意的地方触发事件(可以是推送,拦截的js跳转,各种控件的点击事件)可以跳转到任意界面。
所以我们可以统一用一个控制跳转的manager来完成跳转。
与后端约定好数据结构,例如:
NSDictionary *target = @{@&action& : @&user&,
: @{@&user_id& : @(123456)}};
就是跳转到id为123456的用户页面,如果跳转需要更多的数据,可以在data的value里面继续添加。
创建一个用来跳转的类,可以起的牛x的名字,XXCoreActionManager。创建一个类方法:
+ (BOOL)doActionForTarget:(NSDictionary *)target{
//根据你的app结构,来取得你当前的controller,由它来进行跳转
UIApplication *application = [UIApplication sharedApplication];
AppDelegate *myAppDelegate = (AppDelegate *)[application delegate];
UIViewController *viewC
if ([myAppDelegate getTabbarSelectedView]) {
viewController = [myAppDelegate getTabbarSelectedView].visibleViewController;
return NO;
if([json[@&action&] isEqualToString:@&film_view&]){
MFMaterialListViewController *materialListVC = [[MFMaterialListViewController alloc] initWithNibName:@&MFMaterialListViewController& bundle:nil];
materialListVC.hidesBottomBarWhenPushed = YES;
materialListVC.filmId = json[@&data&][@&film_id&];
[viewController.navigationController pushViewController:materialListVC animated:YES];
return YES;
}else if([json[@&action&] isEqualToString:@&home&]){
[myAppDelegate getTabbar].selectedIndex = 0;
[viewController.navigationController popToRootViewControllerAnimated:YES];
return YES;
return NO;}
在刚才定义的数据结构中,
的值为需要跳转的页面,
的值跳转所需要要的参数,比如
等。服务器只需要传入相应的数据就可以用
[XXCoreActionManager doActionForTarget:target];
来进行跳转。真正的
write once,use anywhere
针对头像、评论、转发等多处使用的子控件,可以把事件由自己接收,通过XXCoreActionManager来进行跳转。即做到了代码分离,使之成为真正独立的控件,便于复用。
下面是一个简单例子:
@implementation MFUserHeadButton-(void)awakeFromNib{
[self addTarget:self action:@selector(toUserDetail) forControlEvents:UIControlEventTouchUpInside];}- (void)toUserDetail{
NSDictionary *target = @{@&action&:@&user&,
@&data&:@{@&user_id&:@(self.tag)}};
[XXCoreActionManager doActionForTarget:target];}
这就是一个简单的实现跳转到个人页功能的头像控件实现。
的值怎么来的?
当然是configCell的时候传给view的
你可能会说,我的跳转需要多个参数啊,你一个tag不够用啊亲。
可以定义一个NSDictionary属性接收啊。
如果你用原生的UI控件,那让强大的runtime给你加喽
- (void)setDict:(NSDictionary *)dict {
objc_setAssociatedObject(self, dictKey, dict, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSDictionary *)dict {
return objc_getAssociatedObject(self, dictKey);}
通过XXCoreActionManager,你可以做到无论你身在何处(哪一个controller),要到何处去(跳转到哪一个controller),你只需要叫来XXCoreActionManager,告诉它你的目的地(target)。你就可以做到想跳就跳。真正的
write once,use anywhere
针对各种有跳转功能的控件,可以做到真的解耦。只需要把它放到他需要显示的位置。告诉它对应的参数就可以了。方便复用和后期的维护。
这次想说的只是一个思路,代码很简单。其实可以使用的地方还有很多。不只是跳转各位童鞋可以自己思考。有什么不明白的可以留言,如果觉得那里不合适更欢迎留言指教或交流。
写在后面的废话
从读大学接触到计算机技术这一领域,我就被这个圈子的氛围深深的触动了,这是一个如此自由、分享、开放的圈子。我从无数人的的分享中汲取着知识(开源的代码,分享的博客),我受益于这种环境,我就想对它做出回馈,写出这篇文章,即希望能帮助一些人,也希望能与大家有更多的交流。最后,谢谢那些无私的做出各种奉献的人。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致iOS应用跳转 - 简书
iOS应用跳转
声明:本文章是参考:的文章: 所写,请大家方便时移步 的博客为他点赞。谢谢!
iOS 应用之间的跳转,是通过设置"URL Scheme"来实现的。简单来说:假设现在有两个应用A与B,我们分别设置了A和B的"URL Scheme",作为这两个App的标识,并通过在A和B的程序中一些设置,来达到应用跳转的目的。
具体的操作流程如下:1、首先设置A与B的"URL Scheme":
1、A_URL.png
2、B_URL.png
2、将A和B的"URL Scheme"添加到对方的白名单中:苹果公司在 iOS9之后 引入白名单概念。在iOS9中,如果使用 canOpenURL: 方法,该方法所涉及到的 URL scheme 必须在"Info.plist"中将它们列为白名单,否则不能使用。(白名单上限是50个)。
3、A_B_URLScheme.png
4、B_A_URLScheme.png
PS:在 iOS9 之前,你可以使用[[UIApplication sharedApplication] canOpenURL:url] 监测用户手机里到底装没装某些应用,来给用户提示。但是也有一些别有用心的App ,这些App有一张常用 App 的"URL scheme"列表,他们会多次调用[[UIApplication sharedApplication] canOpenURL:url] 遍历该表,来监测用户手机都装了什么 App 。比如:"你"装了叫“大姨妈”的App,他就可以知道"你"是女性,他就可以只推给"你"女性用品的广告。这是属于侵犯用户隐私的行为,可能就是导致苹果推出白名单的原因。3、界面、演示及代码:3.1、界面:首先看一下A应用的界面:
5、A_UI.png
5.1、A_cancel.png
5.2、A_comfirm.png
B应用的界面为:
6.1、B_UI_1.png
6.2、B_UI_2.png
6.3、B_UI_3.png
3.2、演示图如下:
3.3、代码:A:在A应用的Appdelegate.m中,代码如下:
#import "AppDelegate.h"
#import "ViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"
@interface AppDelegate ()
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
self.window.backgroundColor = [UIColor whiteColor];
UINavigationController *rootNav = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc] init]];
self.window.rootViewController = rootN
[self.window makeKeyAndVisible];
return YES;
- (BOOL)application:(UIApplication *)application handleOpenURL: (NSURL *)url
NSLog(@"application.1 == %@",application);
NSLog(@"url.1
== %@",url);
return YES;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
NSLog(@"application.2
== %@",application);
NSLog(@"url.2
== %@",url);
NSLog(@"sourceApplication.2 == %@",sourceApplication);
return YES;
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary&NSString*, id& *)options
// 1.获取通过哪一个URL打开我的应用程序
NSString *urlStr = url.absoluteS
// 2.取出window的根控制器
UINavigationController *rootNav = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewC
// 首先回到根控制器
[rootNav popToRootViewControllerAnimated:NO];
// 3.取出MainViewController,使用主要控制器就可以跳转到另外两个控制器
ViewController *rootVc = rootNav.childViewControllers.firstO
if ([urlStr containsString:@"confirm"])
// 确定界面
SecondViewController *viewCon = [[SecondViewController alloc] init];
[rootVc.navigationController pushViewController:viewCon animated:YES];
else if ([urlStr containsString:@"cancel"])
// 取消界面
ThirdViewController *viewCon = [[ThirdViewController alloc] init];
[rootVc.navigationController pushViewController:viewCon animated:YES];
return YES;
在A应用的ViewController.m中,代码如下:
#import "ViewController.h"
@interface ViewController ()
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
self.title = @"项目A";
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"跳转B应用" forState:UIControlStateNormal];
[self.view addSubview:button];
button.frame = CGRectMake(0, 0, 100, 20);
button.center = CGPointMake(self.view.frame.size.width/2, 100);
[button addTarget:self action:@selector(jump:) forControlEvents:UIControlEventTouchUpInside];
UIButton *buttonTwo = [UIButton buttonWithType:UIButtonTypeSystem];
[buttonTwo setTitle:@"跳转B界面二" forState:UIControlStateNormal];
[self.view addSubview:buttonTwo];
buttonTwo.frame = CGRectMake(0, 0, 100, 20);
buttonTwo.center = CGPointMake(self.view.frame.size.width/2, 160);
[buttonTwo addTarget:self action:@selector(jumpViewTwo:) forControlEvents:UIControlEventTouchUpInside];
UIButton *buttonThree = [UIButton buttonWithType:UIButtonTypeSystem];
[buttonThree setTitle:@"跳转B界面三" forState:UIControlStateNormal];
[self.view addSubview:buttonThree];
buttonThree.frame = CGRectMake(0, 0, 100, 20);
buttonThree.center = CGPointMake(self.view.frame.size.width/2, 220);
[buttonThree addTarget:self action:@selector(jumpViewThree:) forControlEvents:UIControlEventTouchUpInside];
// 直接跳转B应用
- (void)jump:(UIButton *)button
NSURL *url = [NSURL URLWithString:@"ObjectB://"];
if ([[UIApplication sharedApplication] canOpenURL:url])
[[UIApplication sharedApplication] openURL:url];
// 跳转B应用界面二
- (void)jumpViewTwo:(UIButton *)button
// 注意:这里将应用A的URL当做参数传给应用B
NSURL *url = [NSURL URLWithString:@"ObjectB://session?ObjectA"];
if ([[UIApplication sharedApplication] canOpenURL:url])
[[UIApplication sharedApplication] openURL:url];
// 跳转B应用界面三
- (void)jumpViewThree:(UIButton *)button
// 注意:这里将应用A的URL当做参数传给应用B
NSURL *url = [NSURL URLWithString:@"ObjectB://timeLine?ObjectA"];
if ([[UIApplication sharedApplication] canOpenURL:url])
[[UIApplication sharedApplication] openURL:url];
B:应用B在Appdelagate.m中,代码如下:
#import "AppDelegate.h"
#import "ViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"
@interface AppDelegate ()
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
self.window.backgroundColor = [UIColor whiteColor];
UINavigationController *rootNav = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc] init]];
self.window.rootViewController = rootN
[self.window makeKeyAndVisible];
return YES;
- (BOOL)application:(UIApplication *)application handleOpenURL: (NSURL *)url
NSLog(@"application.1 == %@",application);
NSLog(@"url.1
== %@",url);
return YES;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
NSLog(@"application.2
== %@",application);
NSLog(@"url.2
== %@",url);
NSLog(@"sourceApplication.2 == %@",sourceApplication);
return YES;
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary&NSString*, id& *)options
// 1.获取通过哪一个URL打开我的应用程序
NSString *urlStr = url.absoluteS
// 2.取出window的根控制器
UINavigationController *rootNav = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewC
// 首先回到根控制器
[rootNav popToRootViewControllerAnimated:NO];
// 3.取出MainViewController,使用主要控制器就可以跳转到另外两个控制器
ViewController *rootVc = rootNav.childViewControllers.firstO
if ([urlStr containsString:@"session"])
SecondViewController *viewCon = [[SecondViewController alloc] init];
viewCon.urlPath =urlS
[rootVc.navigationController pushViewController:viewCon animated:YES];
else if ([urlStr containsString:@"timeLine"])
ThirdViewController *viewCon = [[ThirdViewController alloc] init];
viewCon.urlPath =urlS
[rootVc.navigationController pushViewController:viewCon animated:YES];
return YES;
应用B在界面二(SecondViewController)与界面三(ThirdViewController)中代码相同,所以下面只列出界面二(SecondViewController)的代码,如下:
#import "SecondViewController.h"
@interface SecondViewController ()
@implementation SecondViewController
- (void)viewDidLoad
[super viewDidLoad];
self.title = @"界面二";
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStylePlain target:self action:@selector(clickLeftButton)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"确定" style:UIBarButtonItemStylePlain target:self action:@selector(clickRightButton)];
- (void)clickLeftButton
// 截取字符串,拿到scheme
NSInteger location = [self.urlPath rangeOfString:@"?"].
NSString *scheme = [self.urlPath substringFromIndex:location + 1];
// 通过scheme返回项目A
NSString *news = [NSString stringWithFormat:@"%@://cancel", scheme];
NSURL *newsUrl = [NSURL URLWithString:news];
if ([[UIApplication sharedApplication] canOpenURL:newsUrl])
[[UIApplication sharedApplication] openURL:newsUrl];
- (void)clickRightButton
// 截取字符串,拿到scheme
NSInteger location = [self.urlPath rangeOfString:@"?"].
NSString *scheme = [self.urlPath substringFromIndex:location + 1];
// 通过scheme返回项目A
NSString *news = [NSString stringWithFormat:@"%@://confirm", scheme];
NSURL *newsUrl = [NSURL URLWithString:news];
if ([[UIApplication sharedApplication] canOpenURL:newsUrl])
[[UIApplication sharedApplication] openURL:newsUrl];
4、总结:本篇文章,只是技术实现上的简单演示。在实际的应用中,应用间的跳转要远比这个复杂很多,也严谨很多。但是其实现的原理,也只是在这个原理基础上更加复杂的扩展而已,所以,希望这里对大家有所帮助。5、参考文献:1、2、3、

我要回帖

更多关于 苹果6s手势功能怎么用 的文章

 

随机推荐