All IBOutlets are nil
您好,我正在使用以下代码初始化viewController:
1 | var aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController |
此后,我移至
我正在使用MMDrawer库以具有侧边栏菜单。
1 2 3 4 5 6 7 8 9 | var aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController var aboutUsNavController = UINavigationController(rootViewController: aboutUsViewController) var appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate appDelegate.centerContainer!.centerViewController = aboutUsNavController appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) |
在侧栏上,我选择关于我们的菜单项,然后在创建AboutViewController并将其移到左侧...问题是,当我初始化控制器时,出口为nil
我在使用pageViewController时也遇到此类问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { let pageTitles = ["Title 1","Title 2","Title 3","Title 4"] var images = ["long3","long4","long1","long2"] var count = 0 var pageViewController : UIPageViewController! override func viewDidLoad() { super.viewDidLoad() reset() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func reset() { /* Getting the page View controller */ pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as UIPageViewController self.pageViewController.dataSource = self let pageContentViewController = self.viewControllerAtIndex(0) self.pageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil) /* We are substracting 30 because we have a start again button whose height is 30*/ self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height - 30) self.addChildViewController(pageViewController) self.view.addSubview(pageViewController.view) self.pageViewController.didMoveToParentViewController(self) } func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { var index = (viewController as PageContentViewController).pageIndex! index++ if (index >= self.images.count){ return nil } return self.viewControllerAtIndex(index) } func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { var index = (viewController as PageContentViewController).pageIndex! if index<=0 { return nil } index-- return self.viewControllerAtIndex(index) } func viewControllerAtIndex(index : Int) -> UIViewController? { if((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) { return nil } let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as PageContentViewController pageContentViewController.imageName = self.images[index] pageContentViewController.titleText = self.pageTitles[index] pageContentViewController.pageIndex = index return pageContentViewController } func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return pageTitles.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 } } class PageContentViewController: UIPageViewController { @IBOutlet var imageViewMain: UIImageView! @IBOutlet var labelMain: UILabel! var pageIndex: Int! var titleText: String! var imageName: String! override func viewDidLoad() { super.viewDidLoad() self.imageViewMain.image = UIImage(named:imageName) self.labelMain.text = self.titleText self.labelMain.alpha = 0.1 UIView.animateWithDuration(1.0, animations:{ ()-> Void in self.labelMain.alpha = 1.0 }) // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ } |
我遇到标签和图像出口为零的问题!!!我在使用MMDrawer库时遇到了同样的问题。同样的情况。我没有使用segues!我认为因为这个网点是nil
我假设您在实例化场景后立即查看outlets(如果使用segues并尝试使用
最重要的是,请勿在调用
例如,您可能在
1 | var message: String! |
实例化
1 2 3 4 5 | let aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController // use `as!` in Swift 1.2 aboutUsViewController.message ="some message" presentViewController(aboutUsViewController, animated: true, completion: nil) |
,然后
1 2 3 4 5 | override func viewDidLoad() { super.viewDidLoad() label1.text = message } |
但是您永远不会让原始视图控制器尝试设置/调整目标场景的出口。这是
的责任。
只需确认一下,您的outlets是否正确连接?下面显示了两种方法来确认它们已正确连接。
当您在Interface Builder中选择视图控制器,然后在连接检查器中查看时,您是否看到outlets钩在那里?在以下快照中,连接了
或者,当您查看代码并查看出口时,您在左边距中看到实心点(表示出口已连接)还是空白点(意味着出口未连接)?
您可以在演示之前使用此功能,该功能在iOS9及更高版本上可用:
1 | aboutUsViewController.loadViewIfNeeded() |
我找到了答案。我没有创建UIViewController,而是创建了UIPageViewController !!!