0

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

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

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

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

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

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

更新:当从商店或 AdHoc 绑定安装时,视图将按照 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:找到解决方案。问题已修复。我会做一些进一步的测试,如果我在这里,我会发布一个答案。顺便说一句 - 它在代码中。你可以看到。

4

1 回答 1

0

太明显了,看不出来。

CGFloat yPlacement;

yPlacement += (kTweenMargin * 2.0) + kSegmentedControlHeight;

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

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

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

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

于 2013-02-23T23:25:09.560 回答