0

シミュレーターで適切に表示され、正常に動作し、さまざまなデバイス (異なる世代の iPad と iPhone - iPhone のみのアプリ) でデバッグしているときに、View Controller を取得しました。

しかし、ショップからダウンロードすると、このビューは空のままです。ベータ テスター向けに IPA バインドが作成された場合も、空のままです。

ビュー コントローラがポップされ、表示され、アニメーション化されます。ナビゲーション バーが表示され、呼び出し元のビュー コントローラーに戻ることができます。小さなアプリの他のすべてのビュー コントローラーは問題なく動作します。

ここで何が間違っているのでしょうか?

これが許可されているかどうかはわかりませんが、許可されている場合は、テストしたい人のためにストアへのリンクを提供できます. 無料アプリです。

これは少し前の私の最初のアプリだったので、それは非常にばかげたことかもしれません. ただし、以前は正常に動作していました(afaik)。

更新: ストアまたは AdHoc 境界からインストールすると、ビューは XIB ファイルで定義されているとおりに表示されます。そのファイルでは空です。デバッグ用にシミュレーターまたはデバイスにインストールすると、プログラムで生成された 2 つのコントロールが表示されます。それらは適切に機能します。これは作成コードです:

#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 に答える