“contentSizeForViewInPopover” - 这是做什么的?

时间:2013-07-22 18:43:58

标签: ios ipad cocoa-touch

这既是一个问题,也是一个解决方案。

我最近在我的iPad应用程序中添加了一个非常简单的带有.xib的UIViewController,其中只包含一个UIDatePicker和一个UILabel,我想在我的iPad应用程序中显示为弹出窗口。

Storyboard

我添加了所有相关代码以将此.xib显示为弹出窗口。没有错误或警告,我的UIViewController类 被设置为此.xib的“类”,并且两个控件都显示它们已链接到此特定的 IBOutlets 文件。

但是,当我运行应用程序时,弹出显示得非常好,但如果我尝试访问与这两个控件有关的任何内容,则不会发生任何事情。

因此,例如,以下代码尝试设置标签的文本,以更改UIDatePicker的模式......并且不会发生任何事情。我试过断点,运行代码WAS,控件确实有一个值(它们不是零)但是这段代码不会做任何事情。 UILabel的文本不会被更改,DatePicker将继续处于“日期和时间”模式等。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        // Custom initialization
        [self.datePicker addTarget:self action:@selector(LabelChange:) forControlEvents:UIControlEventValueChanged];

        self.lblQuestion.text = @"Is this working...?";
        self.datePicker.datePickerMode = UIDatePickerModeDate;
        self.datePicker.date = [NSDate date];
    }
    return self;
}

最终 - 最终 - 我添加了一行代码,设置“contentSizeForViewInPopover”:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        // Without this line of code, the code-behind doesn't communicate
        // with the controls in this .xib
        self.contentSizeForViewInPopover = self.view.bounds.size;

        //  ... etc ...

......突然间,它工作得非常漂亮。

enter image description here

所以,我的问题是.. 为什么?!

这一行代码的作用是什么,突然之间我就可以设置我的UILabel的文本,并且可以与UIDatePicker控件进行通信......?

我已经习惯了XCode的怪癖和崩溃,但我很困惑为什么这突然让我的代码开始工作。我很放心,这个怪癖“只”浪费了我生命中的几个小时......并且想了解其背后的原因。

顺便说一下,这是在XCode 4.6.3上运行的,适用于iPad的iOS 6.1 SDK应用程序。

1 个答案:

答案 0 :(得分:3)

装入笔尖时连接插座。第一次访问控制器视图时会加载笔尖。

换句话说,在您的初始化程序中,您的所有商店都是零。但是,如果您致电self.view,您的视图会被加载并连接出口。 contentSizeForViewInPopoverbounds.size无关紧要。

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    self.view; //this is enough
    ...

这就是为什么你不应该把这些代码放到初始化器中而是放到viewDidLoad中。

- (void)viewDidLoad {
    [self.datePicker addTarget:self
                        action:@selector(LabelChange:)
              forControlEvents:UIControlEventValueChanged];

    self.lblQuestion.text = @"Is this working...?";
    self.datePicker.datePickerMode = UIDatePickerModeDate;
    self.datePicker.date = [NSDate date];
}