0

紳士、テーブルビューのフッターとして設定された画像を作成しようとしています。フッター画像は、ナビゲーション バーのボタンのタップに基づいて変更する必要があります。(デザインは、ナビゲーション バーに 2 つのボタンがあり、画面/ビューが読み込まれると、フッターに特定の画像があり、ボタンの 1 つをタップすると変更され、もう 1 つをタップすると元に戻り、すぐ)。

UIImage aa @property を使用してみてから、画像を変更してフレームを設定しようとしましたが、うまくいきませんでした (フレームが正しく設定されていませんでした)。基本的に、私は次のようなことをしたい:

[[self table1] setfooterview : [[uiimageview alloc] initwithframe:(CGRectMake (0,0,50,50)] and then I also need to add initwithimage:[UIImage imagenamed :@"hello-1.png"]] 

しかし問題は、同じステートメントで 2 つの init メソッドを実行できないことです。そして、後で別のメソッドでこれを使用する必要があるため、UIImageView *hello などのオブジェクトを作成することはできません (別のボタンの押下を処理するメソッドで)。(後で、単純な if ステートメントを使用し、押されたボタンに基づいてフッタービューで画像をトリガーします)。私の推測では、
[[self table1] setfooterview: [[uiimageview alloc] initwithframe :(CGRectMake (0,0,50,50)] のようなことをしなければならないかもしれません。有効ですが、何らかの方法でキャストする必要があるかもしれません。

ひどい構文で申し訳ありません。構文エラーはすべて無視してください。現在、私の Mac は手元になく、記憶からこれを入力しているだけであり、iOS プログラミングは初めてです。

4

3 に答える 3

1

2 つの init メソッドを送信する必要はありません。イメージとフレームの両方が のプロパティですUIImageView。(frameプロパティは から継承されUIViewます。) init メッセージを送信した後に設定できます。

あなたはこれを行うことができます:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(...)];
imageView.image = [UIImage imageNamed:@"hello-1"];
self.table1.footerView = imageView;

または、次のようにすることもできます。

UIImageView *imageView = [[UIImageView alloc] initWithImage:
    [UIImage imageNamed:@"hello-1"];
imageView.frame = CGRectMake(...);
self.table1.footerView = imageView;

または、これを行うこともできます:

UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(...);
imageView.image = [UIImage imageNamed:@"hello-1"];
self.table1.footerView = imageView;
于 2013-02-11T07:51:50.463 に答える
0

2 つの init メソッドを呼び出す理由はありません。UIImageView をサブクラス化または拡張して、フレームと画像を一度に設定できる新しい init メソッドを実装できます。しかし、次のこともできます。

UIImageView footerView =  [[uiimageview alloc] initwithframe:(CGRectMake (0,0,50,50)];
footerView.image =  [UIImage imagenamed :@"hello-1.png"];
[[self table1] setfooterview: footerView];

キー入力した代替案です。これは QAed ではなく、完璧な解決策ではないかもしれませんが、正しい方向へのヒントが得られるはずです。.h ファイルに次の 2 行のいずれかを追加します。

- (void) changeFooterImage:(UIImage *) image;
- (void) changeFooterImageNamed:(NSString *)imageName;

.m ファイルに、対応する実装を追加します。

- (void) changeFooterImage:(UIImage *) image {
    if (!self->footerView) {
        self->footerView = [[UIImageView alloc] initWithFrame:CGRectMake (0,0,50,50)];
        [[self tableView] setTableFooterView: footerView];
    }
    self->footerView.image =  image;
}

- (void) changeFooterImageNamed:(NSString *)imageName{
    if (!self->footerView) {
        self->footerView = [[UIImageView alloc] initWithFrame:CGRectMake (0,0,50,50)];
        [[self tableView] setTableFooterView: footerView];
    }
    self->footerView.image =  [UIImage imageNamed :imageName];
}

サード パーティのビュー コントローラーには、このビュー コントローラーの .h ファイルが含まれている必要があります。この方法でクラスを直接バインドしないことは、もう少し「適切」で「型破り」です。このメソッドをプロトコルで宣言してからプロトコルを実装し、メソッドを実際に呼び出す前に、クラスがプロトコルを実装しているかどうかを確認することをお勧めします。しかし、それは一度に少しばかり新しいことをやりすぎているように感じます。これで始めて、後でこれが原則的に機能するときにプロトコルを実装します。

于 2013-02-11T07:54:53.323 に答える
0

「後で別のメソッドでこれを使用する必要があるため、UIImageView *hello などのオブジェクトを作成できません」とはどういう意味ですか?

フッタービューに割り当てる前に、UIImageViewを初期化し、そのフレームと初期画像を設定できる方法。

于 2013-02-11T08:03:23.583 に答える