【问题标题】:Empty view controller in distribution mode分发模式下的空视图控制器
【发布时间】:2013-02-23 20:26:01
【问题描述】:

我有一个视图控制器,它可以很好地显示并且在模拟器中运行良好,同时在各种设备上进行调试(不同代的 ipad 和 iphone - 仅限 iPhone 应用程序)

但是当从商店下载时,这个视图仍然是空的。当 IPA 边界是为 beta 测试者制作时,它也仍然是空的。

视图控制器被弹出、显示和动画。出现导航栏,我可以导航回调用视图控制器。小应用程序的所有其他视图控制器都可以很好地工作。

知道这里可能出了什么问题吗?

我不知道这是否允许,但如果允许,我可以为任何想测试它的人提供商店的链接。这是一个免费的应用程序。

这可能是一些非常愚蠢的事情,因为这是我不久前的第一个应用程序。但是,它曾经可以正常工作(afaik)。

更新: 从商店或 AdHoc boundle 安装时,视图将按照在 XIB 文件中定义的方式显示。在那个文件中它是空的。 在模拟器或设备上安装调试时,我确实看到了两个以编程方式生成的控件。他们甚至可以正常工作。 这是创建代码:

#define kSegmentedControlHeight 40.0
#define kLabelHeight            20.0
#define kLeftMargin             20.0
#define kTopMargin              20.0
#define kRightMargin            20.0
#define kTweenMargin            10.0

- (void)createControls
{
    NSArray *segmentBlendeTextContent = [NSArray arrayWithObjects: @"ganz", @"halb", @"drittel", nil];
    NSArray *segmentISOTextContent = [NSArray arrayWithObjects: @"ISO", @"ASA", @"DIN", @"GOST", nil];

    CGFloat yPlacement;
    CGRect frame;


    // label
    yPlacement += (kTweenMargin * 2.0) + kSegmentedControlHeight;
    frame = CGRectMake( kLeftMargin,
                       yPlacement,
                       self.view.bounds.size.width - (kRightMargin * 2.0),
                       kLabelHeight);
    [self.view addSubview:[SettingsViewController labelWithFrame:frame title:@"Blendstufen:"]];

    fStopSegmentedControl = [[UISegmentedControl alloc] initWithItems:segmentBlendeTextContent];
    yPlacement += kTweenMargin + kLabelHeight;
    frame = CGRectMake( kLeftMargin,
                       yPlacement,
                       self.view.bounds.size.width - (kRightMargin * 2.0),
                       kSegmentedControlHeight);
    fStopSegmentedControl.frame = frame;
    fStopSegmentedControl.tintColor = theGlobals.inBarColor;
    [fStopSegmentedControl addTarget:self action:@selector(fStopSegmentAction:) forControlEvents:UIControlEventValueChanged];
    fStopSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    // Hier wird der Default gesetzt !!!
    fStopSegmentedControl.selectedSegmentIndex = 1;

    [self.view addSubview:fStopSegmentedControl];

    //Setze Control für Blendestufen-Wert
    [fStopSegmentedControl setEnabled:YES forSegmentAtIndex:theGlobals.fStopSetting.integerValue - 1];   

    // label
    yPlacement += (kTweenMargin * 2.0) + kSegmentedControlHeight;
    frame = CGRectMake( kLeftMargin,
                       yPlacement,
                       self.view.bounds.size.width - (kRightMargin * 2.0),
                       kLabelHeight);
    [self.view addSubview:[SettingsViewController labelWithFrame:frame title:@"Normensystem Film/Sensor:"]];

    yPlacement += kTweenMargin + kLabelHeight;
    isoSegmentedControl = [[UISegmentedControl alloc] initWithItems:segmentISOTextContent];
    frame = CGRectMake( kLeftMargin,
                       yPlacement,
                       self.view.bounds.size.width - (kRightMargin * 2.0),
                       kSegmentedControlHeight);
    isoSegmentedControl.frame = frame;
//  isoSegmentedControl.tintColor = [UIColor blackColor];
    isoSegmentedControl.tintColor = theGlobals.inBarColor;
    [isoSegmentedControl addTarget:self action:@selector(isoSegmentAction:) forControlEvents:UIControlEventValueChanged];
    isoSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;

    // Setze Wert für Blendstufen
    isoSegmentedControl.selectedSegmentIndex = theGlobals.isoSetting.integerValue - 1;

    [self.view addSubview:isoSegmentedControl];

    //Setze Control für ISO-Wert
    [isoSegmentedControl setEnabled:YES forSegmentAtIndex:theGlobals.isoSetting.integerValue - 1];   // 1 noch in Variable ändern !!!

}

- (void)viewDidLoad
{   
    [super viewDidLoad];

    self.title = @"Einstellungen";

//  self.view.backgroundColor = [UIColor grayColor];    
    self.view.backgroundColor = [UIColor colorWithRed:32.0/255.0 green:32.0/255.0 blue:32.0/255.0 alpha:1.0];   

    [self createControls];  // create the showcase of controls
}

更新 2:不同之处在于构建配置。当我在本地构建“运行”但使用“分发”配置而不是“开发”配置时,我在设备上观察到相同的行为:空白视图控制器。但是在模拟器上,我确实看到了控件,只是放错了位置。 所以目前我猜这些控件也是设备视图的一部分,但显示在屏幕底线下方。

更新 3:越来越近... 它归结为浮动 yPlacement。在发布模式下,调试器无法显示其内容。在显示变量但未解析的调试器窗口中提到了它。打印其说明时,我得到:

Printing description of yPlacement:
(CGFloat) yPlacement = <variable not available>

因此,最终它似乎归结为一些编译器错误以及可能为调试 (-O0) 而不是为发布/分发 (-Os) 设置的优化标志。或者它只是由于在发布和分发版本中删除了调试符号这一事实引起的。 但是,我可以正确看到框架变量。显然,通过 yPlacement 输入的值是不同的。

更新 5:找到解决方案。问题已修复。我会做一些进一步的测试,如果我在这里,我会发布一个答案。顺便说一句 - 它在代码中。你可以看到。

【问题讨论】:

  • 笔尖真的在你的项目中吗?有时您可能会不小心删除了一个 xib,并且很长一段时间都没有注意到它,因为它已经在您的测试设备和 sim 上。
  • 我会检查的。我想我首先检查它是否是目标的一部分并包含在复制或编译(?)项目中,如果是,那么我会仔细检查它是否真的包含在 *.ipa 中。对吗?
  • 最简单的尝试是从模拟器中删除当前构建。如果这会重现错误,那么它可能指向构建中不存在 xib。
  • 嗯,这并不容易。从模拟器中删除它不会改变。其实我在一个空白的mac上工作。 :) 我以前也有过类似的事情,有一些图像资源。从模拟器中删除应用程序并没有改变。但当时该文件在每台真实设备上都存在错误,在这种情况下并非如此。
  • 那么,全新安装 sim 后,您会看到正确的行为吗?

标签: iphone ios objective-c uiviewcontroller uinavigationcontroller


【解决方案1】:

太明显了,看不出来。

CGFloat yPlacement;

yPlacement += (kTweenMargin * 2.0) + kSegmentedControlHeight;

yPlacement 被定义为局部变量但未初始化。接下来发生的事情不是分配一个值,而是使用+= 运算符将新值添加到变量中。

由于某种原因,在没有任何优化的调试模式下-O0 变量碰巧驻留在零内存中,因此其值为 0,就好像它已正确初始化一样。但事实并非如此!结果到目前为止一切正常,这很容易产生误导。

在分发和发布配置中,优化设置为最小/最快,即-Os。在那种模式下,我很幸运在未初始化的变量中有 0 个值。因此,新值被添加到某个随机值,然后碰巧导致将控件放置在可见区域之外的某个位置。

感谢大家聆听和讨论这个问题。最后,它使我发现了错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2014-12-09
    • 1970-01-01
    • 2011-07-17
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多