![](/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.