![](/img/trans.png)
[英]Subclass from the subclass of UIViewController with Storyboard doesn't work as except
[英]Load an UIView from UIViewController inside storyboard doesn't work
我試圖從我的Storyboard
的UIViewController
加載UIView
而不使用segue
。 我創建了UIViewcontroller
, UIViewcontroller
所有內容,將其與特定類連接並設置了Storyboard ID
。 我還將元素連接到我的類的h.file
,現在我正在尋找一種方法來初始化沒有segue
的這個UIViewController
的subview
。 我一直在搜索並發現很多帖子以這種方式加載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.