调用popover并将变量发送回以前的uiview

时间:2017-01-11 21:43:01

标签: objective-c storyboard uistoryboardsegue

我有一个用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对象,这不是我想要的......我只想回调第一个控制器并传递一个对象。

我该怎么做?

1 个答案:

答案 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
}