我有一个很好地显示的视图控制器,并且可以在模拟器中正常工作,而在各种设备上调试(不同代的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:找到解决方案。问题已修复。我会做进一步的测试,如果我就在这里,我会发一个答案。顺便说一句 - 它就在代码中。你可以看到。
答案 0 :(得分:0)
太明显了。
CGFloat yPlacement;
yPlacement += (kTweenMargin * 2.0) + kSegmentedControlHeight;
yPlacement被定义为局部变量但未初始化。接下来发生的事情不是分配一个值,而是使用+=
运算符将新值添加到变量中。
由于某些原因,在没有任何优化-O0
的调试模式下,变量发生在零内存中,因此值为0就像正确启动一样。但事实并非如此!因此,到目前为止一切工作正常,这是非常误导。
在分发和发布配置中,优化设置为最小/最快,即-Os
。在那种模式下,我很幸运在非初始化的varialbe中有0个值。因此,新值被添加到某个随机值,然后恰好导致将控件放置在可见区域之外的某处。
感谢大家倾听和讨论这个问题。最后它让我找到了错误。