我有一个用storyboard创建的UITableViewController。 比我有一个锚点,它可以调用使用storyboard创建的popOver。 popover是另一个UItableViewController,当我点击一行时,我应该回调第一个控制器并传递一个对象。 我在popover对象中试过这个:
(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([[segue identifier] isEqualToString:@" Fortune"]){
NSIndexPath *indexPath = (NSIndexPath *)sender;
ASFortuneTeller * aController = [segue destinationViewController];
[aController setWYPT:[allWYPTs objectAtIndex:indexPath.row]];
} }
基本上我需要将NSMutableDictionary包传递给第一个UITableViewController。 但我注意到,通过这种方式,我创建了一个新的ASFortuneTeller对象,这不是我想要的......我只想回调第一个控制器并传递一个对象。
我该怎么做?
答案 0 :(得分:1)
快速解决方案(当它总是涉及相同的两个类时)可以是:
在第一个视图控制器的.h文件中,定义一个方法(或只是一个属性):
-(void)selectedWYPT:(NSMutableDictionary*)wypt;
在第二个视图控制器的.h文件中创建一个属性
@property FirstUIViewController *firstView;
在第一个视图控制器中,您将通过segue打开第二个视图控制器,因此您可以使用:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
SecondUIViewController *destination = segue.destinationViewController;
destination.firstView = self;
}
}
在第二个视图中选择行时,您可以使用
if (self.firstView)
[self.firstView setWYPT:[allWYPTs objectAtIndex:indexPath.row]];
将数据传回第一个视图。
如上所述,当涉及相同的两个类时,这将是一个快速的解决方案。
另一种方法是使用协议。当第一个视图控制器不总是FirstUIVierController时,您可以使用以下内容:
<强> SecondUIViewController.h 强>
@class SecondUIViewController;
@protocol SecondUIViewControllerDelegate <NSObject>
-(void)secondUIViewController:(SecondUIViewController*)controller didSelectWYPT:(NSMutableDictionary*)wypt;
@end
@interface SecondUIViewController : UIViewController
@property id<SecondUIViewControllerDelegate> delegate;
@end
<强> SecondUIViewController.m 强>
选择行:
if (self.delegate && [self.delegate respondsToSelector:@selector(secondUIViewController:didSelectWYPT:)])
[self.delegate secondUIViewController:self didSelectWYPT:[allWYPTs objectAtIndex:indexPath.row]];
<强> AnyOtherUIViewController.h 强>
#import "SecondUIViewController.h"
@interface AnyOtherUIViewController : UIViewController <SecondUIViewControllerDelegate>
...
...
<强> AnyOtherViewController.m 强>
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
SecondUIViewController *destination = segue.destinationViewController;
destination.delegate = self;
}
}
-(void)secondUIViewController:(SecondUIViewController*)controller didSelectWYPT:(NSMutableDictionary*)wypt {
//do something with the data
}