我已被建议使用委托传递数据,但它似乎没有显示该字符串的任何日志消息。我将数据从frontViewController传递到backViewController。
@protocol passIdDelegate <NSObject>
-(void)idPassed:(NSString*)idString;
@end
@interface FrontViewController : UIViewController {
id<passIdDelegate> delegate;
}
@property(nonatomic,assign)id delegate;
@end
[delegate idPassed:[[homesDic objectAtIndex:indexPath.row] objectForKey:@"idString"]];
[self performSegueWithIdentifier:@"showHome" sender:self];
@interface HomeProfileViewController : UIViewController <passIdDelegate>{
}
@end
-(void)idPassed:(NSString*)idString{
NSLog(@"%@", idString);
}
答案 0 :(得分:1)
在这种情况下,当您尝试将数据传递给正在呈现的新视图控制器时,委派不是正确的模式。您只需要目标视图控制器上的属性即可接收数据。
@interface HomeProfileViewController : UIViewController{
@property (strong,nonatomic) NSString *idString;
}
@end
NSString *idString = [[homesDic objectAtIndex:indexPath.row] objectForKey:@"idString"]];
[self performSegueWithIdentifier:@"showHome" sender:idString];
-(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];