0

同じメソッドを呼び出す約 60 個のボタンを持つ UIView があります。ボタンをクリックすると、この方法でさまざまな画像が開きます。ボタンタグを使用して、呼び出されたボタンと表示する画像を識別します。ギャラリーのように考えてください。

ボタンの描画が難しかったので、Interface Builder を使い、その UIView で XIB を作成しました。ボタンを正しい場所にドラッグし、イベント TouchUpInside でメソッドに接続するだけです。これを使用して、ビューをメイン ビューに追加しました。

NSArray *xibContents = [[NSBundle mainBundle] loadNibNamed:@"Tour" owner:self options:nil];
UIView *tour = [xibContents lastObject];
[self.view addSubview:tour];

これまでのところ非常に優れているため、一見するとうまく機能します。残念ながら、アプリがしばらく使用されていると、いくつかの問題があります。ボタンはまだ強調表示されています (したがって、まだここにあります!) が、呼び出されるアクションはもうありません。ハイライトだけあり、アクションはありません。

理由はわかりませんが、どういうわけかガベージ コレクターが UIButton ターゲットを破壊しているようです。なんで?どうすれば修正できますか?

プログラムでボタンを宣言していないことに注意してください。IBに入れるだけで十分だと思いました。

また、メモリの警告と UIButton ターゲットの破壊との間の接続を見つけることができませんでした。アプリにメモリの警告が表示されますが、ほとんどの場合、ボタンは引き続き機能します。

しかし、バグは完全にランダムに発生するため、ガベージ コレクターである必要があります。このエラーを再現する方法はありません。5 回クリックした後に発生することもあれば、アプリで 10 分間使用した後に発生することもあります。

4

3 に答える 3

1

次のようにペン先を読み込んでみてください。

まず、ヘッダーにIBOutletプロパティを作成します。次に、ニブを作成するときに、そのUIView IBOutletをニブのトップレベルビュー(すべてが配置されているビュー)に配線します。次に、実装で、次のようにロードします。

 [[NSBundle mainBundle] loadNibNamed:@"Tour" owner:self options:nil];
 // self.view if in a view controller
 [self addSubview:self.tourView]; 

私の推測では、ボタンへのポインタが機能しなくなる可能性がありますが、ガベージコレクションからではない可能性があります。

デバッグするには、次のようなことを試してください。

 for (UIView* view in self.view.subviews)
     if ([view isKindOfClass:[UIButton class]])
     {
               if([self.view respondsToSelector:@selector(myIBAction:)]){
                   NSLog(@"it still sees the method");
                }

         NSLog(@"Button Rect: .2%f, .2%f, .2%f, .2%f", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
      }

コメントで述べたように

于 2012-08-01T13:56:39.467 に答える
1

うまくいかないときに目標を再設定するということは、間違ったことを少し大声で、またはよりしつこく行うように指示することです。

この問題の原因を見つけなければなりません。Instruments を実行し (Build → Profile)、Allocations テンプレートを選択してアプリを起動します。問題が発生するまで実行し、左上にある赤い録音ボタンを押して、Instruments での録音を停止します。

左側のリストで [割り当て] インストルメントを選択し、タイムラインのすぐ下のウィンドウを横切るジャンプ バーで [統計] から [オブジェクト リスト] に変更します。これで、割り当て、保持、解放、および割り当て解除するすべてのオブジェクトの行ができました。小さな矢印をクリックして、各オブジェクトの履歴を表示します。(厳密に言えば、これは各メモリ アドレスに対するものです。多くのオブジェクトは、アプリの実行中に同じメモリ アドレスを再利用できます。) また、右上の任意の項目でフィルター処理したり、右側のサイドバーを展開して、選択した内容の完全なスタック トレースを表示したりできます。エントリをダブルクリックして、ソース コードと関連付けます。

楽器について学ぶことはたくさんあります。ドキュメントを確認し、Web を検索してください。しかし、これは何が起こっているのかを確実に教えてくれるので、なぜそれが起こっているのか、何が起こっていないのかについて推論することができます.

于 2012-08-01T15:10:00.587 に答える
1

これは、すべてのボタンにセレクターを追加する最も簡単な方法です。

for (UIView* view in self.view.subviews)
    if ([view isKindOfClass:[UIButton class]])
    {
         //Add selector
    }
于 2012-08-01T14:08:59.560 に答える