1

我正在做一个 Ipad 应用程序。现在我有 2 个 viewcontroller,ViewController 有一个 button1,它有一个 popover segue 到第二个 viewcontroller(PopoverController)。然后,PopoverController 有一个 button2,如果我单击 button2,我会从我的服务器收到一些 UIImage。如果单击 button2,我想将 UIImageView 的几个子视图添加到 ViewController 以显示这些图像。

button1 效果很好,PopoverController 可以按预期弹出。但是当我点击button2时,什么也没发生。我想知道如何在 2 个视图控制器之间传递数据以及如何将子视图添加到另一个视图控制器。

一些与我的问题有关的代码:

视图控制器.h:

#import <UIKit/UIKit.h>

@class PopoverController;

@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *button1;
@property (strong, nonatomic) PopoverController *popoverController;

@end

弹出控制器.h:

#import <UIKit/UIKit.h>

@class ViewController;

@interface PopoverController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *button2;
@property (strong, nonatomic) UIImage *tempImg;
@property (strong, nonatomic) ViewController *viewController;

- (IBAction)addsubviews:(id)sender;

@end

我不能只[viewController.view addSubview:img1];- (IBAction)addsubviews:(id)sender;方法中使用 addsubview。所以有人可以帮助我吗?:)

====第一次更新====

有人建议我必须使用- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法。我已经通过控制单击 button2 并在 button2 和 ViewController 之间创建自定义 segue 来尝试这个。当我单击button2时,它显示: Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'change'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'

所以我想知道我是否应该添加一个NavigationController. 如果是这样,我该怎么办?

====第二次更新====

我现在使用 Paramasivan 的代码,我找到了从另一个视图控制器调用方法的方法。现在的问题是我的视图控制器中新添加的子视图没有显示出来。我想我必须更新我的视图控制器才能使其可见。

在我- (IBAction)addsubviews:(id)sender;的方法中,我调用 ViewController 中的方法[self.viewController createSubViewWithImage:_tempImg];

所以当我点击button2时可以调用该方法,但是viewcontroller的视图没有任何改变。

4

4 回答 4

1

查看Communicating with Objects文档,有几种方法可以做你想做的事。

于 2012-11-28T07:36:31.890 回答
1

在 ViewController.h 添加以下内容

-(void)createSubViewWithImage:(UIImage *)imageDownloaded {
    UIImageView *imageViewTemp = [[UIImageView alloc] initWithImage:imageDownloaded];
    [self.view addSubView:imageViewTemp];
}

在 PopoverController.h 添加以下内容

@property (nonatomic, retain) ViewController *viewControllerPassed;

图像下载后,在 PopoverController.h 中调用以下命令

[viewControllerPassed createSubViewWithImage:imageDownloaded];
于 2012-11-28T07:39:27.823 回答
1

添加这个- (void)viewDidLoad

self.popoverController = [[PopoverController alloc] init]; 
self.popoverController.viewController = self;

确保您在其他地方没有设置self.popoverController = ....

不要在课堂上添加任何东西。你也不必这样做。如果您已经拥有它,只需删除这些行。self.viewController = ...popovercontrollerself.viewController.popoverController = self;

完成这些后,请确保您self.popoverController仅在弹出窗口中显示,并且没有为那里的类创建新对象popoverController。因此,如果这些都很好,您可以使用任何您想要的方法将图像从popoverController一个类传递到viewController另一个类。

正如您在评论中提到的,您可以[self.viewController createSubViewWithImage:_tempImg];popovercontroller课堂上使用。

更新: 如果你是通过故事板做的,你需要在prepareForSegue方法中设置它,你根本不需要创建self.popoverController。在您的情况下删除该部分。您可以按照此处提到的过程设置自定义 segue 并实现prepareForSegue传递对象的方法。资料来源:故事板、视图和传递数据

  1. 将故事板中的 segue 名称设置为“CustomSegue”
  2. 实现prepareForSegue方法
  3. 在方法内部,检查 segue 的名称是否与“CustomSegue”匹配,然后将对象viewController中的设置为,popoverController

尝试,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"CustomSegue"]) {
        PopoverController *popoverController = [segue destinationViewController];
        popoverController.viewController = self;
    }
}

完成此操作后,您需要打电话给[self.viewController createSubViewWithImage:_tempImg];您的popoverController班级。

于 2012-11-30T00:44:35.507 回答
0

您可以使用以下方法传递数据:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if ([segue.identifier isEqualToString:@"ViewController2"])
    {
        ViewController2 *v2VC = [segue destinationViewController];
        v2VC.yourData = self.someStuff;
    }
 }
于 2012-11-28T07:34:26.767 回答