委派传递数据无响应

时间:2014-08-18 22:04:16

标签: ios objective-c delegates

我已被建议使用委托传递数据,但它似乎没有显示该字符串的任何日志消息。我将数据从frontViewController传递到backViewController。

frontViewController.h

@protocol passIdDelegate <NSObject>

-(void)idPassed:(NSString*)idString;

@end



@interface FrontViewController : UIViewController {

    id<passIdDelegate> delegate;
}

@property(nonatomic,assign)id delegate;

@end

frontViewController.m在didSelectRow

中传递数据
[delegate idPassed:[[homesDic objectAtIndex:indexPath.row] objectForKey:@"idString"]];

[self performSegueWithIdentifier:@"showHome" sender:self];

backViewController.h

@interface HomeProfileViewController : UIViewController <passIdDelegate>{

}

@end

backViewControlller.m

-(void)idPassed:(NSString*)idString{
    NSLog(@"%@", idString);
}

3 个答案:

答案 0 :(得分:1)

在这种情况下,当您尝试将数据传递给正在呈现的新视图控制器时,委派不是正确的模式。您只需要目标视图控制器上的属性即可接收数据。

BackViewController.h

@interface HomeProfileViewController : UIViewController{

@property (strong,nonatomic) NSString *idString;

}

@end

frontViewController.m在didSelectRow

中传递数据
NSString *idString =  [[homesDic objectAtIndex:indexPath.row] objectForKey:@"idString"]];

[self performSegueWithIdentifier:@"showHome" sender:idString];

在frontViewController.m prepareForSegue

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showHome"]) {
        HomeProfileViewController *hpvc = (HomeProfileViewController *)segue.destinationViewController;
        hpvc.idString=(NSString *)sender;
    }
}

答案 1 :(得分:0)

backviewController.m中,您需要frontViewController.delegate = self;

之类的内容

答案 2 :(得分:0)

要将数据从ViewControllerB传递回ViewControllerA,您需要使用Protocols and Delegates或Blocks,后者可以用作回调的松散耦合机制。

为此,我们将使ViewControllerA成为ViewControllerB的委托。这允许ViewControllerB将消息发送回ViewControllerA,使我们能够重新发送数据。

要使ViewControllerA成为ViewControllerB的委托,它必须符合我们必须指定的ViewControllerB&#39协议。这告诉ViewControllerA它必须实现哪些方法。

在ViewControllerB.h中,在#import下面,但在@interface上方指定协议。

@class ViewControllerB;

@protocol ViewControllerBDelegate <NSObject>
- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
@end

接下来仍然在ViewControllerB.h中你需要设置一个委托属性并在ViewControllerB.m中进行合成

@property (nonatomic, weak) id <ViewControllerBDelegate> delegate;

在ViewControllerB中,当我们弹出视图控制器时,我们在委托上调用一条消息。

NSString *itemToPassBack = @"Pass this value back to ViewControllerA";
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];

它适用于ViewControllerB。现在在ViewControllerA.h中,告诉ViewControllerA导入ViewControllerB并遵守其协议。

#import "ViewControllerB.h"

@interface ViewControllerA : UIViewController <ViewControllerBDelegate>

在ViewControllerA.m中,从我们的协议

实现以下方法
- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item
{
    NSLog(@"This was returned from ViewControllerB %@",item);
}

我们需要做的最后一件事是告诉ViewControllerB,在我们将ViewControllerB推送到导航堆栈之前,ViewControllerA是它的委托。

ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
viewControllerB.delegate = self
[[self navigationController] pushViewController:viewControllerB animated:YES];