0

小さな UIScrollViews に独自の UIViewController がある iPad アプリを設計しています。これらのコントローラーのビューには、IBAction メソッドを呼び出すボタンがあります。しかし、それは機能していません。実際、シミュレーターでそれらが押されているようには見えません。

これは、私が何をしているのかを理解するためのコードです。

// In UIViewController A (say the parent or root that have several UIScrollViews)

    MiniViewController * mini = [[MiniViewController alloc]init];
    [scrollView1 addSubview:mini.view];

//repeat the same process a couple of times with different uiscrollsviews and instances of miniviewcontrollers

ご想像のとおり、MiniController は非常にシンプルです。.h ファイルのみを投稿します。

@interface MiniControlador : UIViewController {
     IBOutlet UIButton * button;
}
@property (nonatomic, retain) IBOutlet UIButton * button;
- (IBAction)doSomething:(id)sender;
@end

インターフェイス ビルダーを使用して、UIButton の「ボタン」を doSomething というメソッドに接続していることがわかります。しかし、私がすでに言ったように、それは機能していません。

もう一つ。また、Mini Controller インスタンスを使用して UIScrollView にボタンをプログラムで追加しようとしましたが、うまくいきました。しかし、私はそれが非常にハードコードされていると確信しています。

どう思いますか?提案をいただければ幸いです。

4

3 に答える 3

2

Apple のView Controller Programming Guideは重要な読み物であり、画面ごとに 1 つのビュー コントローラーという Apple の哲学について多くのことを説明しています。

ビュー コントローラの動作の多くは、一度に 1 つのビュー コントローラしか動作しないという前提に基づいて構築されています。その仮定に違反すると、動作は未定義になります (または少なくとも文書化されません)。この場合、あなたの説明は、コントローラーをルート ビューとそのルートのスーパービュー (通常は前の画面) の間のレスポンダー チェーンに挿入するという通常のビュー コントローラーの動作が機能していないことを示唆しています。

適切に機能する初期化方法が見つかる場合もありますが、それらが機能することを保証するものではなく、将来の OS の更新で動作が変わる可能性があります。

編集: View Controller Programming Guide からの関連する引用:

作成した各カスタム ビュー コントローラー オブジェクトは、単一のビュー階層内のすべてのビューを管理します。iPhone アプリケーションでは、従来、ビュー階層内のビューは画面全体をカバーしますが、iPad アプリケーションでは、画面の一部のみをカバーする場合があります。ビュー コントローラーとそのビュー階層内のビューとの間の 1 対 1 の対応は、重要な設計上の考慮事項です。同じビュー階層の異なる部分を管理するために、複数のカスタム ビュー コントローラーを使用しないでください。同様に、単一のカスタム ビュー コントローラー オブジェクトを使用して、複数の画面に相当するコンテンツを管理しないでください。

于 2011-03-14T21:52:51.183 に答える
1

みんなありがとう、私は最終的にクラスのオブジェクトを使用してこれを解決します(私はGenericViewControllerと呼びました)。これは実際には通常の UIViewController のように機能し、IBActions はあらゆるイベント (ボタンが押されるなど) に適切に応答します。

UILabels、ボタンなどを含めるために IBOutlet UIView を使用しました。

誰かが興味を持っているなら、ここにいくつかのコードがあります。

@interface GenericViewController : NSObject {
  /* Some IBOutlets here*/

     //like a regular UIView of an UIViewController, this holds the rest of the outlets
  IBOutlet UIView * view;
  } 
   //some IBActions here
  }

次に、UIScrollView は各 GenericViewController オブジェクトのビューのみを追加します

[scrollView addSubview:genericViewControllerObject.view];

誰かがより良い解決策を持っている場合は、私に知らせてください:)

于 2011-06-17T21:27:29.177 に答える
0

InterfaceBuilder で作成した xib からビューを読み込んでいますか?
私は自分のアプリで似たようなことをしていますが、それは私のために働いています。
私はinitこのような方法を実装しています:


- (id)init
{
    if (self = [super initWithNibName:@"__your_xib_name__" bundle:[NSBundle mainBundle]])
    {
        // TODO: Add additional initializing here
        // ...
    }

    return self;
}

ビューを xib からロードしていない場合、接続は確立されません (初期化された IBOutlets もトリガーされた IBActions もありません)。

于 2011-03-14T21:52:44.623 に答える