“contentSizeForViewInPopover” - 这是做啥的?

Posted

技术标签:

【中文标题】“contentSizeForViewInPopover” - 这是做啥的?【英文标题】:"contentSizeForViewInPopover" - what does this do?“contentSizeForViewInPopover” - 这是做什么的? 【发布时间】:2013-07-22 18:43:57 【问题描述】:

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

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

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

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

因此,例如,以下代码尝试设置标签的文本、更改 UIDatePicker 的模式……但什么都不会发生。我尝试了断点,代码 WAS 正在运行,控件确实有一个值(它们不是 nil)但是这段代码不会做任何事情。 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 ...

...突然间,它工作得很好。

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

这行代码到底是做什么的,突然让我可以设置我的 UILabel 的文本,并可以与 UIDatePicker 控件对话...?

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

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

【问题讨论】:

显示控制器的弹出框的默认大小。 是的,从它的名字,我推断出“contentSizeForViewInPopover”应该做什么。但是没有这一行,控件的大小完全相同,仍然显示为弹出窗口,但我的代码无法访问其控件中的值。那是我的问题。为什么这样的“默认大小”功能会完全影响控件的工作方式? 【参考方案1】:

加载笔尖时,插座已连接。当您第一次访问控制器的视图时会加载 nib。

换句话说,在您的初始化程序中,您的所有出口都为零。但是,如果您调用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];

【讨论】:

哦...我太笨了。是的,你完全正确。谢谢你。现在说得通了!!

以上是关于“contentSizeForViewInPopover” - 这是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章