我正在做一个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;
来添加子视图。有人可以帮助我吗? :)
====第一次更新====
有人建议我必须使用- (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的代码,我找到了从另一个viewcontroller调用方法的方法。现在的问题是我的viewcontroller中新添加的子视图没有显示出来。我想我必须更新我的viewcontroller以使其可见。
在我的- (IBAction)addsubviews:(id)sender;
方法中,我通过[self.viewController createSubViewWithImage:_tempImg];
所以当我点击button2时可以调用该方法,但viewcontroller的视图没有任何改变。
答案 0 :(得分:1)
查看Communicating with Objects文档,有多种方法可以执行您想要的操作。
答案 1 :(得分: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];
答案 2 :(得分:1)
在- (void)viewDidLoad
,
self.popoverController = [[PopoverController alloc] init];
self.popoverController.viewController = self;
确保在其他任何地方都设置self.popoverController = ...
。
NOT 在self.viewController = ...
课程中添加popovercontroller
之类的内容。你也不必做self.viewController.popoverController = self;
。如果您已经拥有它们,请删除它们。
完成这些操作后,请确保仅在弹出窗口中显示self.popoverController
,并且您没有在那里为popoverController
课程创建新对象。因此,如果这些都很好,您可以使用任何方法将图像从popoverController
类传递到viewController
类。
正如您在评论中提到的,您可以在[self.viewController createSubViewWithImage:_tempImg];
课程中使用popovercontroller
。
<强>更新强>
如果您是通过故事板进行的,则需要使用prepareForSegue
方法进行设置,而不必创建self.popoverController
。在你的情况下删除该部分。您可以按照此处提到的过程设置自定义segue并实现prepareForSegue
方法来传递对象。资料来源:On storyboards, views and passing data along
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
。
答案 3 :(得分:0)
您可以使用以下方法传递数据:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ViewController2"])
{
ViewController2 *v2VC = [segue destinationViewController];
v2VC.yourData = self.someStuff;
}
}