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

Posted

技术标签:

【中文标题】调用 popover 并将变量发送回之前的 uiview【英文标题】:call popover and send back variable to previous uiview 【发布时间】:2017-01-11 21:43:00 【问题描述】:

我有一个使用情节提要创建的 UITableViewController。 比我有一个锚点,它也叫一个用故事板创建的 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】:

一个快速的解决方案(当它总是涉及相同的两个类时)可能是:

在第一个视图控制器的.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

【讨论】:

很好解释和实施的解决方案。 :) 感谢解释...但是属性返回错误:.h文件中的未知类型名称...是#import "nameOftheClass.h"实现... @yorh 要关闭弹出框,在将值传递回第一个视图控制器后,您可以使用:[self.navigationController popViewControllerAnimated:YES];。关于未知类型名称,请确保不要在两个 .h 文件中相互导入! FirstViewController.h 应该被导入到第二个的 .h 文件中。 SecondViewController.h 应该导入到第一个的 .m 文件中..

以上是关于调用 popover 并将变量发送回之前的 uiview的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 UIButton 以编程方式调用 ViewController PopOver

数据在从 Form2 发送回 Form1 之前验证

来自 UIWindow 的子视图并将其发送回 UIwindow

使用 Django 模板设置默认值

NodeJS:从 JSON 中提取数据,修改对象并将其发送回同一个 JSON 文件

NodeJs/Express 编写 xlsx 模板并将其发送回浏览器下载