新手给页面传值整死了,求帮助啊

萬里無雲 2015-02-12 04:36:02
网上介绍的方法基本都是2个页面的传值,我试验了3种,从一个 view controller到另外一个view controller或者nav controller都可以进行传值
但是从view controller --》nav controller --》其他如collection view controller,就怎么也不行了。

方法1:sender传值
在controller1点击按钮事件中通过[self performSegueWithIdentifier:@"loginSeq" sender:self]; 进行页面跳转;
然后通过sender进行传值

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

id page2=segue.destinationViewController;
[page2 setValue:self.listData forKey:@"listData"];

}

在controller2 nav controller中定义listData,我可以获取到controller1的值,然后我想用controller2的sender进行传值,但是该页面2的sender方法不执行。不知道在什么情况下该方法才执行?

方法2:通过Delegate直接传值controller3
在controller1的.h中定义第三个controller的代理

@protocol SysSelDelegate
-(void)sysInfoList:(NSMutableArray *)values;//1.1定义协议与方法
@end

@interface ViewController : UIViewController

@property (retain,nonatomic) id <SysSelDelegate> trendDelegate;
@property NSMutableArray *listData;
@end

.m中直接传值给第3个controller

SysSelViewController *sysSelViewController = [[SysSelViewController alloc] initWithNibName:@"SysSelViewController" bundle:nil];
self.trendDelegate=sysSelViewController; //设置代理
[self.trendDelegate sysInfoList: listData];

第三个controller中下面的方法中也成功获取到了controller1的值

-(void)sysInfoList:(NSMutableArray *)values{
listData=values;
}

但是在之后执行的numberOfItemsInSection啊,collectionView等方法中确又没有值了。调试代码发现sysInfoList方法执行完成后又回去执行controller1后面的语句了,执行完成后又回来执行controller3,值丢了

方法3:
在controller1页面点击按钮方法中直接给controller3赋值,但是发现页面都不能跳转

SysNavController *aaa=[[SysNavController alloc] init];
aaa.listData=listData;
[self.navigationController pushViewController:aaa animated:YES];


请大家帮帮忙。。。。
...全文
382 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Smile_Couson 2015-02-19
  • 打赏
  • 举报
回复
路过看看,一般用不到这么多传值方法吧。
ReyZhang 2015-02-16
  • 打赏
  • 举报
回复
我上面回复的已经很详细了。如果还有什么不明白的,可以继续提问。我所指出的应该是你方法2,及方法3中的实现。但在方法2中你对代理的解理及用法可能还存在偏差。
Bannings 2015-02-13
  • 打赏
  • 举报
回复
引用 2 楼 liyun919 的回复:
[quote=引用 1 楼 zhangao0086 的回复:] 方法一中,“页面2的sender方法不执行”是什么意思?页面2的哪个方法没有执行?
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 这个方法不执行。如果在Storyboard中使用model类型的segue连线是可以执行的,但是那样的话第三个页面就变成一片黑。现在使用的root view controller。[/quote] 你的页面2有没有触发事件跳转到页面3?
ReyZhang 2015-02-13
  • 打赏
  • 举报
回复
控制器之间的传值不是那么复杂。一般情况下的传值有两种情况,如有A,B 两个控制器。一种情况是,A向B传值,还一种情况是 B回传值给A。下面简单说一下这两种方式的实现 第一种情况比较简单,用的也比较多。A控制器向B控制器跳转时,同时向B传值。我们常用的解决办法是在B控制器中公开一个可被外部访问的属性,在A向B跳转时设置这个属性。B控制器在viewDidLoad中可接收到这个属性,并做处理。 第二种情况在实际开发过程中也能经常碰到。如下场景:由于ios没有默认的下拉列表控件dropdownlist ,我们在处理这种选择时,会另寻它法,通常会用一个弹出窗口或另开一个页面的方式显示加载全部的可选项,在选择结束后,我们希望选择的值能回传给它的调用者,以实现选择。处理这种回传值的情况在ios中我们可以通过“代理”,block, 或通知来实现(通常是前两种) 在你的方法2中,你就使用了代理的方式来实现传值。但你在使用的过程中有问题。 如果一个控制器(B)要把值回传给另外一个控制器(A),那么我们称B为发送者,A为接收者。 在B中定义协议方法,在A中实现B的协议方法,如我描述的场景,选择列表的控制器(B)在选择完成后回传值给(A)

@protocol BDelegate:<NSObject>
-(void)b:(B *)b didSelectedValue:(NSString *)str;
@end
@interface B: UIViewController 
@property(assign) id<BDelegate> delegate;
@end

@implementation B
 //////选择动作
-(IBAction)chooseItem:(id)sender {

     NSString *value = XXXx;//......得到选择的值
     
     //////判断代理是否有订阅者
    if ([self.delegate respondToSelector:@selector(b:didSelectedValue:)]) {
            [self.delegate b:self didSelectedValue:value]; ////////将value值回传
    }
}
@end

@interface A: UIViewController <BDelegate>    ////////指明A需要实现B的协议
@end
@implementation A

#pragram mark B Delegate
-(void)b:(B *)b didSelectedValue:(NSString *)str {
       //////////str 即为从B回传过来的值,在A中根据这个值做处理。
}
@end
萬里無雲 2015-02-13
  • 打赏
  • 举报
回复
引用 1 楼 zhangao0086 的回复:
方法一中,“页面2的sender方法不执行”是什么意思?页面2的哪个方法没有执行?
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 这个方法不执行。如果在Storyboard中使用model类型的segue连线是可以执行的,但是那样的话第三个页面就变成一片黑。现在使用的root view controller。
Bannings 2015-02-12
  • 打赏
  • 举报
回复
方法一中,“页面2的sender方法不执行”是什么意思?页面2的哪个方法没有执行?

29,047

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧