ios开发跳转qq nsobject怎么跳转

iOS 万能跳转界面方法 (runtime实用篇一) - CSDN博客
iOS 万能跳转界面方法 (runtime实用篇一)
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?)
思考:wocao!这变态的需求,要拒绝他吗?
switch判断呗,考虑所有跳转的因素?这不得写死我...
switch&()&{
&&&&case&:
&&&&&&&&break;
&&&&default:
&&&&&&&&break;
我是这么个实现的(runtime是个好东西)
利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了 ---O(∩_∩)O哈哈哈
比如:根据推送规则跳转对应界面HSFeedsViewController
HSFeedsViewController.h:
进入该界面需要传的属性
@interface&HSFeedsViewController&:&UIViewController
//&注:根据下面的两个属性,可以从服务器获取对应的频道列表数据
/**&频道ID&*/
@property&(nonatomic,&copy)&NSString&*ID;
/**&频道type&*/
@property&(nonatomic,&copy)&NSString&*
AppDelegate.m:
推送过来的消息规则
//&这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数
NSDictionary&*userInfo&=&@{
&&&&&&&&&&&&&&&&&&&&&&&&&&&@&class&:&@&HSFeedsViewController&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&@&property&:&@{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&ID&:&@&123&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&type&:&@&12&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&};
接收推送消息
-&(void)application:(UIApplication&*)application&didReceiveRemoteNotification:(NSDictionary&*)userInfo
&&&&[self&push:userInfo];
-&(void)push:(NSDictionary&*)params
&&&&//&类名
&&&&NSString&*class&=[NSString&stringWithFormat:@&%@&,&params[@&class&]];
&&&&const&char&*className&=&[class&cStringUsingEncoding:NSASCIIStringEncoding];
&&&&//&从一个字串返回一个类
&&&&Class&newClass&=&objc_getClass(className);
&&&&if&(!newClass)
&&&&&&&&//&创建一个类
&&&&&&&&Class&superClass&=&[NSObject&class];
&&&&&&&&newClass&=&objc_allocateClassPair(superClass,&className,&0);
&&&&&&&&//&注册你创建的这个类
&&&&&&&&objc_registerClassPair(newClass);
&&&&//&创建对象
&&&&id&instance&=&[[newClass&alloc]&init];
&&&&//&对该对象赋值属性
&&&&NSDictionary&*&propertys&=&params[@&property&];
&&&&[propertys&enumerateKeysAndObjectsUsingBlock:^(id&key,&id&obj,&BOOL&*stop)&{
&&&&&&&&//&检测这个对象是否存在该属性
&&&&&&&&if&([self&checkIsExistPropertyWithInstance:instance&verifyPropertyName:key])&{
&&&&&&&&&&&&//&利用kvc赋值
&&&&&&&&&&&&[instance&setValue:obj&forKey:key];
&&&&//&获取导航控制器
&&&&UITabBarController&*tabVC&=&(UITabBarController&*)self.window.rootViewC
&&&&UINavigationController&*pushClassStance&=&(UINavigationController&*)tabVC.viewControllers[tabVC.selectedIndex];
&&&&//&跳转到对应的控制器
&&&&[pushClassStance&pushViewController:instance&animated:YES];
检测对象是否存在该属性
-&(BOOL)checkIsExistPropertyWithInstance:(id)instance&verifyPropertyName:(NSString&*)verifyPropertyName
&&&&unsigned&int&outCount,&i;
&&&&//&获取对象里的属性列表
&&&&objc_property_t&*&properties&=&class_copyPropertyList([instance
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&class],&&outCount);
&&&&for&(i&=&0;&i&&&outC&i++)&{
&&&&&&&&objc_property_t&property&=properties[i];
&&&&&&&&//&&属性名转成字符串
&&&&&&&&NSString&*propertyName&=&[[NSString&alloc]&initWithCString:property_getName(property)&encoding:NSUTF8StringEncoding];
&&&&&&&&//&判断该属性是否存在
&&&&&&&&if&([propertyName&isEqualToString:verifyPropertyName])&{
&&&&&&&&&&&&free(properties);
&&&&&&&&&&&&return&YES;
&&&&free(properties);
&&&&return&NO;
具体使用和代码:&
本文已收录于以下专栏:
相关文章推荐
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定...
作者:汉斯哈哈哈 授权本站转载。
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的cell,可能...
/ios/04.html
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转...
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我...
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我...
由于文章篇幅长度原因,笔者单独用一篇文章来介绍使用runtime来实现万能控制器跳转。查看完整的runtime在实际开发中的使用点击链接 ——& runtime从入门到精通(六)—— runtime在...
在开发项目中,会有这样变态的需求:
推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的名字,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪...
相信大家是不是遇到过推送跳转到相关页面进行操作,JS交互时也需要跳转相关的页面,然后这个的页面都是不确定,每次跳转页面也不固定这时我们该怎么做呢?原文简单思路:
1、后台提供json,信息包括:要...
import “AppDelegate.m”- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions...
iOS开发runtime实现任意界面跳转
1.在开发中我们常常有这种需求:比如说现在有一组列表,服务器返回的数据在这组列表中,点击列表的某一行是根据服务器返回的Action字段决定跳转,这个时候的界...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)iOS 在NSObject子类的执行代码中实现UIViewController的跳转 - 简书
iOS 在NSObject子类的执行代码中实现UIViewController的跳转
在iOS开发中, 要实现UIViewController之间的跳转,通过navigationController的pushViewController或者UIViewController自身的presentViewController的方式即可。但要求是从一个UIViewController跳到另外一个UIViewController中。如果要从NSObject子类的执行代码中做跳转至UIViewController的操作, 要如何实现呢?首先, 说明下为何会有这样的需求, 即: UICollectionView -& NSObjectSubclass -& UIViewController:设置UICollectionView的datasource和delegate为一个NSObject的子类, 用于处理所有跟UICollectionView的datasource和delegate相关的逻辑关系. 那么在该类的执行代码中可能有调转到另一个UIViewController的使用场景. 此时, 不能使用pushViewController, 因self根本就没有navigationController属性;也不能使用presentViewController, self不是UIViewController的子类。解决方式可以考虑一下两种:
delegate的方式
delegate是iOS中非常常见的方法. 设置UICollectionView的xxxDelegate为该NSObjectSubclass, 实现其中的方法xxxDelegateMethod1, 然后在NSObjectSubclass的执行代码中调用xxxDelegate的xxxDelegateMethod1方法. 该方法的实现在UICollectionView(包含navigationController属性)中, 因此在其中可以实现UIViewController之间的正常跳转.
rootViewController
在NSObjectSubclass的执行代码中, 先获取当前的rootViewController, 在做UIViewController之间的跳转:
UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
[rootViewController presentViewController:filterCourseViewController animated:NO completion:nil];
最终, 要实现UIViewController之间的跳转, pushViewController或presentViewController的执行代码所处的类self必须要有navigationController属性, 或者必须是UIViewController的子类.
当你越来越漂亮时,自然有人关注你。当你越来越有能力时,自然会有人看得起你。改变自己,你才有自信,梦想才会慢慢的实现。做最好的自己,懒可以毁掉一个人,勤可以激发一个人!不要等夕阳西下的时候才对自己说,想当初、如果、要是,之类的话!不为别人,只为做一个连自己都羡慕的人。iOS-UITableView-处理cell上按钮事件(弹出警示框,页面跳转等) - iOS_满聪 - 博客园
想要源码的朋友,可以留下QQ邮箱.
posts - 82, comments - 28, trackbacks - 0, articles - 0
实现UITableViewCell上按钮点击事件可以进行页面跳转.
二. 实现方法:
& & 1. 用协议的方式的实现.
& & 2. 需要自定义UITableViewCell.
三. 代码部分.
#import &UIKit/UIKit.h&
@protocol SevenProtocolDelegate &NSObject&
- (void)sevenProrocolMethod:(UIViewController *)viewController and:(NSInteger)cellR
@interface SevenCell : UITableViewCell
@property (nonatomic, weak) id&SevenProtocolDelegate& customD
@property (nonatomic, strong) UIViewController
@property (nonatomic, assign) NSInteger
#import "SevenCell.h"
#import "Masonry.h"
@interface SevenCell ()
@property (nonatomic, strong) UIView
@property (nonatomic, strong) UIButton
@implementation SevenCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
[self addSubviews];
- (void)addSubviews
[self addSubview:self.bgView];
[self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self).with.insets(UIEdgeInsetsMake(0, 0, 10, 0));
[self.bgView addSubview:self.button];
[self.button mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.bgView).with.offset(10);
make.top.mas_equalTo(self.bgView).with.offset(10);
make.size.mas_equalTo(CGSizeMake(200, 40));
- (void)buttonClicked
if (self.customDelegate != nil && [self.customDelegate respondsToSelector:@selector(sevenProrocolMethod:and:)])
[self.customDelegate sevenProrocolMethod:self.viewController and:self.cellRow];
#pragma mark - setter & getter
- (UIView *)bgView
if (!_bgView)
self.bgView = [[UIView alloc] init];
self.bgView.backgroundColor = [UIColor whiteColor];
return _bgV
- (UIButton *)button
if (!_button)
self.button = [UIButton buttonWithType:UIButtonTypeCustom];
self.button.layer.masksToBounds = YES;
self.button.layer.cornerRadius = 20.0f;
self.button.backgroundColor = [UIColor orangeColor];
self.button.titleLabel.font = [UIFont boldSystemFontOfSize:14.0f];
[self.button setTitle:@"button点击事件跳转下一个页面" forState:UIControlStateNormal];
[self.button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self.button addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
controller.m中
#import "SevenViewController.h"
#import "SevenCell.h"
#import "Seven_oneViewController.h"
#import "Masonry.h"
@interface SevenViewController () &UITableViewDelegate,UITableViewDataSource,SevenProtocolDelegate&
@property (nonatomic, strong) UITableView * tableV
@implementation SevenViewController
#pragma mark - 生命周期
#pragma mark viewDidLoad
- (void)viewDidLoad
[super viewDidLoad];
[self basicSetting];
[self addTableView];
#pragma mark - 系统代理
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
return 80;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString * identifier = @"cell";
SevenCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell)
cell = [[SevenCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
cell.customDelegate =
cell.viewController =
cell.cellRow = indexPath.
#pragma mark - 点击事件
#pragma mark - 实现方法
#pragma mark - 自定义协议
- (void)sevenProrocolMethod:(UIViewController *)viewController and:(NSInteger)cellRow
// 可以通过 cellRow 区分哪个cell上的button跳转对应的页面
if (cellRow == 0 || cellRow == 1)
Seven_oneViewController * seven_one = [[Seven_oneViewController alloc] init];
[self.navigationController pushViewController:seven_one animated:YES];
#pragma mark 基本设置
- (void)basicSetting
self.title = @"cell上button页面跳转";
- (void)addTableView
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 0, 0, 0));
#pragma mark - setter & getter
- (UITableView *)tableView
if (!_tableView)
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
self.tableView.delegate =
self.tableView.dataSource =
return _tableV[iOS开发]runtime交换某个对象的两个方法 - 简书
[iOS开发]runtime交换某个对象的两个方法
OC是一门动态语言,方法的调用本质上是利用objc_msgSend进行"发消息",也就是某类或某对象调用其某方法,本质上是向某个对象的指针发送了一条消息,在此之前方法和对象(或类)都没有真正确定下来即动态绑定,消息与方法的真正实现是在执行阶段绑定的,而非编译阶段.
所谓动态绑定,我举一个简单的C语言例子
#import &stdio.h&
void Chinese() {
printf("Chinese book");
void Math() {
printf("Math book");
void doTheThing(int type) {
if (type == 0) {
Chinese();
对于上面这一类型到底是调用hello函数还是goodbye函数,这两个函数都是已经确定的,就像是有一本语文书一本数学书放在你面前,而你已经知道这两本中的一本最终会被你拿到手上,语文书和数学书已经是放在那里的了,不是动态改变啊的.
#import &stdio.h&
void Chinese() {
printf("Chinese book");
void Math() {
printf("Math book");
void doTheThing(int type) {
void (*func)();
if (type == 0) {
而对于这一种类型,我们可以看到我们声明了一个函数指针func,就好比你拿到了够买其中一本书的钱,只是钱在你手里,到底是买语文书还是数学书还没有确定,手上的钱是会动态改变的,这叫做动态绑定.
当向一个对象发送消息时,objc_msgSend方法根据对象的isa指针找到对象的类,然后在类的调度表(dispatch table)中查找selector。如果无法找到selector,objc_msgSend通过指向父类的指针找到父类,并在父类的调度表(dispatch table)中查找selector,以此类推直到NSObject类。一旦查找到selector,objc_msgSend方法根据调度表的内存地址调用该实现。 通过这种方式,message与方法的真正实现在执行阶段才绑定。
为了保证消息发送与执行的效率,系统会将全部selector和使用过的方法的内存地址缓存起来。每个类都有一个独立的缓存,缓存包含有当前类自己的 selector以及继承自父类的selector。查找调度表(dispatch table)前,消息发送系统首先检查receiver对象的缓存。
我们现在看一下objc_msgSend如何使用
先在控制器中定义一个方法
- (void)changeColor:(UIColor *)colorOne colorTwo:(UIColor *)colorTwo colorThree:(UIColor *)colorThree colorFour:(UIColor *)colorFour{
static NSUInteger count = 0;
NSUInteger k = count %4 ;
switch (k) {
self.view.backgroundColor = colorO
self.view.backgroundColor = colorT
self.view.backgroundColor = colorT
self.view.backgroundColor = colorF
然后对其进行调用
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event{
SEL change = @selector(changeColor:colorTwo:colorThree:colorFour:);
UIColor *colorOne = [UIColor blueColor];
UIColor *colorTwo = [UIColor greenColor];
UIColor *colorThree = [UIColor redColor];
UIColor *colorFour = [UIColor yellowColor];
这里到底有几个参数你就放几个id,当然你也可以直接指定类型
((void(*)(id,SEL, id,id,id,id))objc_msgSend)(self,change , colorOne, colorTwo,colorThree,colorFour);
交换两个方法
在实际开发中我们会遇到这样一个问题,当项目开发得差不多的时候,或者说到了项目迭代的时候,我们发现了内存泄露(如block的不规范使用导致),不知道到底是哪个View或者说是哪个控制器没有正常被回收.那么我们常用的做法就是在- (void)dealloc方法中打印某些字样,去控制台看到底是在哪些界面跳转或者回跳的时候哪些对象没有调用dealloc方法.
在这个时候我们要是去一个个文件中重写dealloc方法就太繁琐了,而且容易漏掉一些类.面对这种情景,使用分类,在分类中交换方法是最好的解决办法,而且它的实现不需要引入分类头文件
#import "UIView+dealloc.h"
#import &objc/runtime.h&
@implementation UIView (dealloc)
+ (void)load{
Method m2 = class_getInstanceMethod([self class], @selector(myDealloc));
Method m1 = class_getInstanceMethod([self class], NSSelectorFromString(@"dealloc"));
method_exchangeImplementations(m2, m1);
//系统调用dealloc方法的时候会调用该方法
- (void)myDealloc{
NSLog(@"%@挂了", self);
//此刻实际是在调用dealloc方法
[self myDealloc];
我这里写了一个UIView的分类,也就是说所有UIView的子类被回收的时候都能够调用这个犯法,其中+ (void)load 方法会被调用一次,它并不需要该文件被使用才会被调用,也就是在能内存中加载的时候就会被调用,且仅有一次,在这一次调用中我们把UIView的两个对象方法进行了替换(也就是在最早的时候就交换了方法,相当于把这两条神经给交换接上了).
以上就是一个经常遇到的的runtime替换两个方法的使用场景,若有写的不好的地方欢迎指出.
版权声明:本文版权归本文作者所有,始发于简书,如需转载请联系作者,违者必究.
坑大且深 方为好坑【iOS界面处理】使用storyboard实现页面跳转,简单的数据传递 - CSDN博客
【iOS界面处理】使用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,造就了点击后无法跳转。现在终于明朗了,记录下来,供不明白的同学学习。
----------------------------------------------------------------------------------------------------
&//根据&segue Identifier跳转界面
& & [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五种不同的类型。
最常用的场景,新的场景完全盖住了旧的那个。用户无法再与上一个场景交互,除非他们先关闭这个场景。
是在viewController中的标准切换的方式,包括淡出什么的,可以选切换动画。
Modalview:就是会弹出一个view,你只能在该view上操作,而不能切换到其他view,除非你关闭了modalview.
Modal View对应的segue type就是modal segue。
*Modal:Transition to another scene for the purposes of completing a task.当user在弹出的modalview里操作完后,就应该dismiss the modal view scene然后切换回the originalview.
Push类型一般是需要头一个界面是个Navigation Controller的。
是在navigation View Controller中下一级时使用的那种从右侧划入的方式
*Push:Create a chain of scenes where the user can move forward or back.该segue type是和navigation viewcontrollers一起使用。
popover(iPad only)
popover 类型,就是采用浮动窗的形式把新页面展示出来
*Popover(iPad only):Displays the scene in a pop-up “window” over top of the current view.
Replace (iPad only):
替换当前scene,
Replace the current scene with another. This is used in some specialized iPad viewcontrollers (e.g. split-view controller).
就是自定义跳转方式啦。
*Custom:Used for programming a customtransition between scenes.
在Storyboard中使用自定义的segue类型
参考/?p=72
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
《Xib下的视图跳转》
现在说一下,没有使用Storyboard,直接创建xib时的页面跳转,其实也很简单,只要理解了,都不是问题。我也是从java刚转过来,起初感觉很不适应,但是现在发现interface builder真的是太强大了。
1,创建一个项目,我用的是Empty Application模版,这种模版创建出来的项目只包含一个Appdelegate.h和Appdelegate.m文件,rootviewController需要我们自行创建。(注意:最新的版本,apple把MainWindow.xib文件取消了,所以无法打开xib查看包含的图标)此时运行模拟器只会显示空白的界面。好了,File-newFile 创建一个Object-C class,打开后,subclass of 选择默认的UIViewController,注意,需要勾选上With
XIB for user interface,不然一会无法创建主视图。
2,创建好后,打开其xib文件,简单添加一些button组件。此时保存运行程序还是无法显示我们创建的RootViewController。【有时如果你在项目清单下的user interface 选择此MainViewController运行后台还会报:Applications are expected to have a root view controller at the end of application launch的错误,原因都是项目的Delegate无法发现一个rootViewContrller】所以这就需要我们手动在AppDelegate中让它们关联起来。
AppDelegate.h
AppDelegate.m
[self.viewController就是我们在.h文件中声明的]
3,好了,保存后,这个时候运行就能显示我们的界面了~同样也很简单吧!好了,我们现在参照以上的方法,再创建一个SecondViewController(记得勾选xib),然后我们给rootviewcontroller视图的 button添加一个事件方法,可以让它点击后跳转到SecondViewController。
(首先创建了一个SecondViewController并实例化,intitWithNibName的参数一定要正确写控制器配对的xib文件的名称,调用presentModalViewController:controller 就可以跳转啦。)
发现了把,其实都挺简单的,本来可以创建single View Application模板的,这样就省去创建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的方法发送了出去,接下来要做的就是在secondViewController声明一个@property NSString * 类型,名称为data的字符串,然后在其.m文件中的-(void) viewDidLoad方法中写入如下代码://08
注意:发送数据时,[send setValue:msg forKey:@&data&]; 这个&data&名称一定要与跳转后界面的声明的类型对象的命名一致,不然的话,跳转后的界面是收不到传递的值的。
方法二,使用notification广播实现视图跳转传递数据,继续上面的项目展开。
广播机制分为:注册----发送------------接收(接收方),具体请看一下代码。
1,在要发送数据的视图页面.m文件处理发送逻辑的方法里注册+发送
-&(IBAction)pressed:(id)sender&{&&
&&&&NSLog(@&send&message:%@&,firstField.text);&&
&&&&NSDictionary&*dicts&=&[NSDictionary&dictionaryWithObjectsAndKeys:@&one1&,@&one&,@&two2&,@&two&,@&three3&,@&three&,&nil];&&
&&&&NSNotification&*notification&&=[NSNotification&notificationWithName:@&mynotification&&object:firstField.text];&&
&&&&[[NSNotificationCenter&defaultCenter]&postNotification:notification];&&
&&&&[[NSNotificationCenter&defaultCenter]&postNotificationName:@&mynotification2&&object:dicts];&&
notificationWithName:参数的值是自己定义,接收方以此名称为接收标识。
2,在跳转后,接收数据视图页面.m文件中处理逻辑的方法里 接收
-&(void)viewDidLoad&&
&&&&[super&viewDidLoad];&&
&&&&[[NSNotificationCenter&defaultCenter]&addObserver:self&selector:@selector(notificationHandler:)&name:@&mynotification&&object:nil];&&
&&&&[[NSNotificationCenter&defaultCenter]&addObserver:self&selector:@selector(notificationHandler2:)&name:@&mynotification2&&object:nil];&&
-(void)&notificationHandler:(NSNotification&*)&notification{&&
&&&&secondField.text&=&[notification&object];&&
-(void)&notificationHandler2:(NSNotification&*)&notification2{&&
&&&&NSDictionary&*dict&=&[notification2&object];&&
&&&&&NSLog(@&receive&dict&:%@,forkey:%@&,dict,[dict&objectForKey:@&one&]);&&
注意:如果注册的notification在目标视图没有收到或名称写错,目标视图的相关方法就不会执行
国外参考论坛【传送门】
方法三,通过Delegate委托传递数据
此方法我测试完后,感觉不是太好用,有一些局限性,相当于自定义读取方法:无非是在A对象里保存了一个B对象的指针,然后在A的某个函数里去设置B对象某个属性的值。
具体看教程把。
1,首先add a File-- &Objective-C protocol,然后声明一个传递数值的方法:
@protocol&ViewPassValueDelegate&&NSObject&&&
-(void)&passValue&:(&NSString&*)&&&
2,然后在要发送数据的视图的.h文件下声明一个自定义的delegate
#import&&UIKit/UIKit.h&&&
#import&&ViewPassValueDelegate.h&&&
@interface&ViewController&:&UIViewController{&&
&&&&NSObject&ViewPassValueDelegate&&*delegte&;&&
-&(IBAction)pressed:(id)&&
@property&(retain,&nonatomic)&IBOutlet&UITextField&*firstF&&
3,在要发送数据的视图的事件处理方法里声明一个secondViewController实例,然后赋值给 delegate,同时执行协议的 passValue方法
-&(IBAction)pressed:(id)sender&{&&
&&&&secondViewController&*secondController&=&[[secondViewController&alloc]&init];&&
&&&&delegte&=&&secondC&&
&&&&[delegte&passValue:firstField.text];&&
4,然后在接收数据视图(secondViewController).h文件实现自定义协议
@interface&secondViewController&:&UIViewController&ViewPassValueDelegate&&&
5,在接收数据视图(secondViewController).m文件中实现协议中的passValue方法:
-(void)&passValue:(NSString&*)value{&&
&&&&secondField.text=&&&
&&&&NSLog(@&passValue&method&get&Value&:&%@&secondField.text:%@&,value,secondField.text);&&
至此,大功告成,打印输出会显示你在第一个界面发送的数据,但是我把此数据赋值于页面的UITextField对象,但是此对象得到的值总是null,无法在界面展示出来,我也很苦恼,什么方法都尝试完了,发现此接收方法总是会在ViewDidLoad方法之后执行,并且方法体内设置UITextField任意值都无法成功。
目前总结是,以上value只是对视图1对象赋值时的一个指针引用,出了方法范围,就无效了。所以在方法体内打印都是有数据的,出了方法体,就没有持有的引用了。
本文已收录于以下专栏:
相关文章推荐
1、属性传值
前向后传值。
2、协议传值
3、Block传值
代替协议代理传值,主要时间点问题。
4、单利传值
数据共享。
5、通知传值
NSNotificationCenter提供了一...
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众...
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知,...
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知,...
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知,...
 由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没...
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard。(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知,...
(4.4.1)使用storyboard实现页面跳转,简单的数据传递
分类: iphone开发
13:27 30340人阅读 评论(22) 收藏 举报
   ...
苹果推出故事版很久了,一直没有深入学习过。最近打算尝试用StoryBoard做高保真交互App原型,决定学习下。相对于IB来讲,StoryBoard几乎不用手写代码,便能实现页面交互,这一点很...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 ios开发跳转qq 的文章

 

随机推荐