如何将子视图添加到另一个视图控制器?

Posted

技术标签:

【中文标题】如何将子视图添加到另一个视图控制器?【英文标题】:How to add subview to another viewcontroller? 【发布时间】:2012-11-28 07:30:17 【问题描述】:

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

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

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

ViewController.h:

#import <UIKit/UIKit.h>

@class PopoverController;

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

@end

PopoverController.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

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

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

有人建议我必须使用- (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; 方法中,我通过[self.viewController createSubViewWithImage:_tempImg]; 调用ViewController 中的方法

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

【问题讨论】:

您的问题到底是什么? “我不能只使用 [..]” - 为什么? 您在使用该线路时遇到了什么问题? @jimpic 抱歉,我的意思是这行代码可以编译但没有达到我的预期 @ACB 这行代码什么也没做,至少如果我删除这行代码我没有看到任何不同。 @Manted,你是如何设置 viewController 属性的?你在做什么,popovercontroller.viewcontroller = self; 在显示这个弹出窗口之前?另一种方法是将图像作为viewcontroller.image = self.tempimage 传递给上一个类,然后在viewcontroller 中调用一些方法,该方法将在imageview 中设置此图像。 【参考方案1】:

将此添加到- (void)viewDidLoad

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

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

popovercontroller 类中添加类似self.viewController = ... 的内容。而且您也不必这样做self.viewController.popoverController = self;。如果您已经拥有它,只需删除这些行。

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

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

更新: 如果您通过情节提要进行操作,则需要在 prepareForSegue 方法中进行设置,而您根本不必创建 self.popoverController。在您的情况下删除该部分。您可以按照此处提到的过程设置自定义 segue 并实现 prepareForSegue 方法来传递对象。来源:On storyboards, views and passing data along

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

试试,

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

完成此操作后,您需要在 popoverController 类中调用 [self.viewController createSubViewWithImage:_tempImg];

【讨论】:

如果我在PopoverController 中删除了这些行,我现在不能调用-(void)createSubViewWithImage:(UIImage *)imageDownloaded 方法。 @Manted,错误是什么?因为如果你使用它,你正在创建 viewController 的新实例,与之前的对象不同。另外你是如何显示popover的?使用代码还是通过故事板?问题是您需要将其设置为您显示为弹出框的同一对象。但是您为 popover 显示了一个不同的对象。 我只是控制单击button1并拖动到PopoverController,并使用popover segue。可以吗? @Manted,在这种情况下,您需要在我的回答中进行更新部分。 1.我必须创建一个新的segue吗?还是使用从button1PopoverControllerpopover segue? 2. 我必须在ViewController.m 中实现prepareForSegue 方法吗?或PopoverController.m?我尝试控制点击button2并拖动到ViewController创建一个新的custom segue,其标识符为change并在prepareForSegue实现prepareForSegue方法PopoverController.m,当然我改了名字在 change 的方法里面。但是当我点击button2时,我得到一个错误:'Could not find a navigation controller for segue 'change'【参考方案2】:

查看Communicating with Objects 文档,有多种方法可以满足您的需求。

【讨论】:

【参考方案3】:

在 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];

【讨论】:

仍然没有发生任何事情。这里的viewControllerPassed 和我的ViewController 一样吗? 你好,我现在可以调用这个方法,但是问题是新添加的子视图没有显示出来。我需要更新视图控制器来显示它吗?如果是这样,如何实施?干杯【参考方案4】:

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 
    if ([segue.identifier isEqualToString:@"ViewController2"])
    
        ViewController2 *v2VC = [segue destinationViewController];
        v2VC.yourData = self.someStuff;
    
 

【讨论】:

所以我必须控制 click button2 来创建一个新的自定义 segue?我试过这个,然后我收到以下错误:'由于未捕获的异常'NSGenericException'而终止应用程序,原因:'找不到用于segue'change'的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用推送 segue。''

以上是关于如何将子视图添加到另一个视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保留选项卡栏的同时将子视图控制器添加到选项卡式视图控制器?

如何将子 ViewController 的视图添加到父 View 控制器的子视图中?

如何在不丢失导航栏的情况下将子视图添加到 UINavigation 控制器?

将子视图添加到外部屏幕 (iOS5)

将子视图添加到视图控制器时,ScrollView 不滚动

iOS - 将子视图添加到子视图控制器视图