![](/img/trans.png)
[英]How to SubView a ViewController into a SubView of another ViewController
[英]How to add subview to another viewcontroller?
我正在做一个Ipad应用程序。 现在我有2个viewcontrollers,ViewController有一个button1,它有一个popover segue到第二个viewcontroller(PopoverController)。 然后,PopoverController有一个button2,如果我点击button2,我将从我的服务器收到一些UIImage。 我想在ViewController中添加几个UIImageView的子视图,以便在我单击button2时显示这些图像。
button1运行良好,PopoverController可以按预期弹出。 但是,当我点击按钮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
我不能只使用[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.'
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的代码,我找到了从另一个viewcontroller调用方法的方法。 现在的问题是我的viewcontroller中新添加的子视图没有显示出来。 我想我必须更新我的viewcontroller以使其可见。
在我的- (IBAction)addsubviews:(id)sender;
方法,我通过[self.viewController createSubViewWithImage:_tempImg];
调用ViewController中的方法[self.viewController createSubViewWithImage:_tempImg];
所以当我点击button2时可以调用该方法,但viewcontroller的视图没有任何改变。
查看“ 与对象通信”文档,有几种方法可以执行您想要的操作。
在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];
将此添加到- (void)viewDidLoad
,
self.popoverController = [[PopoverController alloc] init];
self.popoverController.viewController = self;
确保在其他任何地方都没有设置self.popoverController = ...
不要添加其它东西一样self.viewController = ...
在popovercontroller
类。 你不必做self.viewController.popoverController = self;
同样。 如果您已经拥有它们,请删除它们。
完成这些操作后,请确保仅在弹出窗口中显示self.popoverController
,而不是在那里为popoverController
类创建新对象。 因此,如果这些都很好,您可以使用任何方法将图像从popoverController
类传递给viewController
类。
正如您在评论中提到的,您可以使用[self.viewController createSubViewWithImage:_tempImg];
在你的popovercontroller
类中。
更新:如果你是通过故事板进行的,你需要在prepareForSegue
方法中设置它,你self.popoverController
创建self.popoverController
。 在你的情况下删除该部分。 您可以按照此处提到的过程设置自定义segue并实现prepareForSegue
方法来传递对象。 来源: 在故事板,视图和传递数据
prepareForSegue
方法 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
类中。
您可以使用以下方法传递数据:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ViewController2"])
{
ViewController2 *v2VC = [segue destinationViewController];
v2VC.yourData = self.someStuff;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.