关于ios:所有IBOutlets都为零

All IBOutlets are nil

您好,我正在使用以下代码初始化viewController:

1
 var aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController

此后,我移至aboutViewController。但是我在aboutViewController上的所有IBOutlets都是nil!为什么会这样?
我正在使用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并尝试使用prepareForSegue中的outlets,您还将看到此行为)。但是直到您呈现/推送到该场景,加载视图并调用viewDidLoad之后,outlets才会被连接。

最重要的是,请勿在调用viewDidLoad之前尝试使用outlets(即,在实例化场景后不要立即使用outlets)。而是将所需的数据传递到目标场景(例如String属性),然后目标的viewDidLoad应该填充出口。

例如,您可能在AboutUsViewController中具有一个属性:

1
var message: String!

实例化AboutUsViewController时,需要设置该属性:

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)

,然后AboutUsViewControllerviewDidLoad将使用该属性相应地填充出口:

1
2
3
4
5
override func viewDidLoad() {
    super.viewDidLoad()

    label1.text = message
}

但是您永远不会让原始视图控制器尝试设置/调整目标场景的出口。这是AboutUsViewController

的责任。

只需确认一下,您的outlets是否正确连接?下面显示了两种方法来确认它们已正确连接。

当您在Interface Builder中选择视图控制器,然后在连接检查器中查看时,您是否看到outlets钩在那里?在以下快照中,连接了label1,但没有连接label2

enter


您可以在演示之前使用此功能,该功能在iOS9及更高版本上可用:

1
    aboutUsViewController.loadViewIfNeeded()

我找到了答案。我没有创建UIViewController,而是创建了UIPageViewController !!!