委托方法获得的值是否清楚?

时间:2015-05-31 02:30:14

标签: ios objective-c

在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

1 个答案:

答案 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,设置参数并为您呈现。