在tableViewControllerA.h中我声明了一个委托,并且在tableViewControllerA.m中我单击tableView的单元格时实现该方法,A将值传递给B,并执行perfromSegueWithIdentifier以跳转到tableViewControllB,在tableViewControllB.m中调用get方法,我得到了值,但是在viewDidLoad()方法调用之后,该值变为nil。请帮我解决问题。顺便说一句,价值的属性是强大的,非原子的。
DTZHomeTableViewController.h
#import <UIKit/UIKit.h>
#import "PassData.h"
@protocol PassDataDelegate
-(void)passData:(PassData*) dataToProgram;
@end
@interface DTZHomeTableViewController :
UITableViewController<UITableViewDelegate,UITableViewDataSource>
@property(assign,nonatomic) id<PassDataDelegate> dataDelegate;
@end
PassData is an user-defined class
DTZHomeTableViewController.m
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
ProgramTableViewController *programViewController=
[[ProgramTableViewController alloc]init];
self.dataDelegate=programViewController;;
PassData *jump=[[PassData alloc]init];
jump.livingStatus=YES;
jump.role=0;
jump.index=indexPath.row;
jump.curOnlineNum=305605;
[self.dataDelegate passData:jump];
[self performSegueWithIdentifier:@"showSelectedProgram" sender:self];
}
ProgramTableViewController.h
#import <UIKit/UIKit.h>
#import "DTZHomeTableViewController.h"
@interface ProgramTableViewController :
UITableViewController<PassDataDelegate,UITableViewDataSource,UITableViewDelegate>
@property(strong,nonatomic) PassData * dataFromHome;
@end
ProgramTableViewController.m
@implementation ProgramTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"view did load%@",self.dataFromHome); // log :null
}
- (void) passData:(PassData *)dataToProgram
{
self.dataFromHome=dataToProgram;
}
@end
答案 0 :(得分:0)
委派不是将数据传递给受控制的视图控制器的正确方法。相反,您想要传递prepareForSegue:sender:
删除协议和委托。
为ProgramTableViewController添加属性以获取要传递的数据。
@property (nonatomic, assign) BOOL livingStatus;
@property (nonatomic, assign) NSInteger role;
@property (nonatomic, assign) NSInteger row;
@property (nonatomic, assign) NSInteger curOnlineNum;
在prepareForSegue:sender:
中,将ProgramTableViewController的传递属性设置为与所选行关联的值:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)__unused sender
{
if ([[segue identifier] isEqualToString:@"showDetail"])
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
ProgramTableViewController *controller = (ProgramTableViewController *)[segue destinationViewController];
controller.livingStatus = YES;
controller.role = 0;
controller.row = indexPath.row;
controller.curOnlineNum = 305605;
}
}
您不应在tableView:didSelectRowAtIndexPath:
中分配和初始化ProgramTableViewController。您的segue将为您实例化目标视图控制器。
您甚至不需要tableView:didSelectRowAtIndexPath:
方法。您可以在Storyboard中创建从tableViewCell到ProgramTableViewController的push segue。给segue一个标识符(例如“showDetail”)。然后在prepareForSegue中,您按照我的解释分配值。
点击该行时,segue将创建一个ProgramTableViewController,设置参数并为您呈现。