簡體   English   中英

從故事板內的UIViewController加載UIView不起作用

[英]Load an UIView from UIViewController inside storyboard doesn't work

我試圖從我的StoryboardUIViewController加載UIView而不使用segue 我創建了UIViewcontrollerUIViewcontroller所有內容,將其與特定類連接並設置了Storyboard ID 我還將元素連接到我的類的h.file ,現在我正在尋找一種方法來初始化沒有segue的這個UIViewControllersubview 我一直在搜索並發現很多帖子以這種方式加載UIViewController

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"];

嘗試添加這樣的視圖,視圖跳轉到下一個UIViewController

pointVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:pointVC animated:YES completion:NULL];

addChildViewController一樣添加它也不起作用:

[self addChildViewController:pointVC];

在初始化之后,我嘗試將特定UIViewController一個UIViews添加到我的實際View中,但它不起作用。 如果我只使用前兩行,則不會發生任何事情, UIViewController對象內部沒有UIViews ,因為從不會調用viewDidLoad 有任何想法嗎?


我也試過了

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"];
[self addChildViewController:pointVC];
[self.view addSubview:pointVC.viewPointsDialog];
[pointVC didMoveToParentViewController:self];

它應該是

[self.view addSubview:pointVC.view];

代替

[self.view addSubview:pointVC.viewPointsDialog];

所以最終的工作代碼應如下所示:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"];
[self addChildViewController:pointVC];
[self.view addSubview:pointVC.view];
[pointVC didMoveToParentViewController:self];

您可以在pointVC.view上使用setFrame來正確定位它。

首先,如果您使用故事板初始化UIViewController

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    pointVC = (PointsViewController *)[storyboard instantiateViewControllerWithIdentifier:@"PointsViewController"];

這只會初始化視圖控制器,排序為alloc/init方法。 因此,如果您嘗試將視圖添加為視圖控制器視圖的子視圖,此時它將無法工作,因為視圖控制器的視圖尚未加載。 您必須首先push/present/addChild視圖控制器,然后添加子視圖。

其次,如果你創建了segues,只需使用performSegueWithIdentifier:方法來推送/呈現視圖控制器(有模態segue),並在你推/呈現的視圖控制器viewWillAppear/viewDidAppear方法中添加subivew(不要這樣做)在viewDidLoad因為視圖的框架可能尚未正確設置)。

第三,如果您使用autolayout,則可能必須檢查約束並確保禁用從spring轉換為autolayout,因為addSubview將啟用該轉換。

元素全部為零的原因是元素將僅在顯示視圖后加載。 您可以強制它加載元素。 這對我有用:

UIViewController *vC = 
 [[UIStoryboard storyboardWithName:@"ViewControllers" 
                            bundle:nil] 
     instantiateViewControllerWithIdentifier:@"MyViewController"];`  
vC.view.frame = self.view.frame;  

然后,您可以顯示或顯示視圖:

[self presentViewController:vC animated:YES completion:nil];

我必須為從故事板加載的任何視圖控制器執行此操作。 如果從nib或xib文件加載視圖控制器,則無需執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM