分配模式下的空视图控制器

时间:2013-02-23 20:26:02

标签: iphone ios objective-c uiviewcontroller uinavigationcontroller

我有一个很好地显示的视图控制器,并且可以在模拟器中正常工作,而在各种设备上调试(不同代的ipads和iphone - 仅限iPhone的应用程序)

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

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

知道这里有什么问题吗?

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

这可能是一些非常愚蠢的事情,因为这是我不久前的第一个应用程序。但是,它过去工作正常(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>

所以最后它似乎归结为一些编译器错误以及可能为debug(-O0)设置的优化标志,但不适用于发布/分发(-Os)。或者仅仅是因为在发布和发布版本中剥离了debuging符号这一事实。 然而,框架变量,我可以正确看到。通过yPlacement输入的值通常是不同的。

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

1 个答案:

答案 0 :(得分:0)

太明显了。

CGFloat yPlacement;

yPlacement += (kTweenMargin * 2.0) + kSegmentedControlHeight;

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

由于某些原因,在没有任何优化-O0的调试模式下,变量发生在零内存中,因此值为0就像正确启动一样。但事实并非如此!因此,到目前为止一切工作正常,这是非常误导。

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

感谢大家倾听和讨论这个问题。最后它让我找到了错误。