質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

【iOS】違うメソッド間で同じ変数を使いたい

受付中

回答 5

投稿 ・編集

  • 評価
  • クリップ 6
  • VIEW 2,964

moumaitai

score 78

iOS開発をしております。
違うメソッド間で同じ変数を使えず、開発が詰まっております。
具体的には一つのメソッドでUIimageViewに画像を設定して、他のタイミングで呼ばれるメソッドでその画像を隠すというものです。
どなたかお分かりになる方、助けていただけると助かります。

UITableViewクラスの.hファイル
#import "Sample2TableViewCell.h"
#import "UIImageView+WebCache.h"

@interface TimelineTableViewController : UITableViewController<UIScrollViewDelegate>

{
    Sample2TableViewCell  *cell;
}

@property (nonatomic, retain) Sample2TableViewCell *cell;

@end

UITableViewクラスの.mファイル
#import "TimelineTableViewController.h"
#import "Sample2TableViewCell.h"
#import "AFNetworking/AFNetworking.h"
#import "UIImageView+AFNetworking.h"
#import "UIImageView+WebCache.h"
#import "QuartzCore/QuartzCore.h"


@interface TimelineTableViewController (){
    Sample2TableViewCell *cell;
}

@end

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
  //カスタムセルのクラスの設定
    NSString *cellIdentifier = @"TimelineTableViewCell";
    _cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!_cell){
        _cell = [[Sample2TableViewCell alloc]
                initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }
   
  //各セルにサムネイル画像を設定(出来ている。) 
    NSString *thumbnailURL = [_thumbnail_ objectAtIndex:indexPath.row];
    [_cell.thumbnailView  setImageWithURL:[NSURL URLWithString:thumbnailURL]
                         placeholderImage:[UIImage imageNamed:@"yomikomi simple.png"]];
    return _cell ;
}

//動画再生前に呼び出されるメソッド
-(void)movieLoadStateDidChange:(id)sender{
    if(MPMovieLoadStatePlaythroughOK ) {
        NSLog(@"STATE CHANGED");
       //再生前にサムネイル画像を隠す(ここが失敗する)
       _cell.thumbnailView.hidden = YES;
        
    }
}

カスタムセルの.hファイル
@interface Sample2TableViewCell : UITableViewCell

//サムネイル画像(UIImageView)
@property (retain, nonatomic) IBOutlet UIImageView *thumbnailView;

@end

カスタムセルの.mファイル
#import "Sample2TableViewCell.h"

@implementation Sample2TableViewCell

@synthesize thumbnailView;

@end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

0

一つのクラスで複数のメソッド間で変数を共有したいなら
ヘッダファイルに変数を宣言するとかいいじゃないでしょうか。


クラス間の変数の受け渡しですと
シングルトンを使ってみては?

下記に参考サイトのURLを張っておきます。

ちなみに、シングルトンはstaticでメモリ空間を占領してしまうので
乱用には気を付けてくださいね。

あとは、同じクラスから継承させてその親クラスで
値の橋渡しをするとか・・・

シングルトン参考サイト
http://blog.syuhari.jp/archives/2178
http://www.bright-sys.co.jp/blog/design-pattern-for-iphone-01/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/23 10:33

    <<
    一つのクラスで複数のメソッド間で変数を共有したいなら
    ヘッダファイルに変数を宣言するとかいいじゃないでしょうか。
    <<
    今回はおそらく同じクラスの中のメソッド間での変数共有です。
    ヘッダーで宣言していると思うのですが、記述が足りないのでしょうか?

    キャンセル

  • 2014/10/23 11:21

    一度、tableViewメソッドで_cellに値が入っているか確認してみては(return する直前)?
    そこで、実態がなかったらそこに問題があるとわかりますので。
    それか、@endの位置ですかね?
    一番下にしてみては?
    すみません、推測での回答で。。。

    キャンセル

  • 2014/10/23 11:26

    もし、実行できるならエラーコードを張っていただけますか?
    あと、UITableView.hをUITableView.mでimportしてみては?

    キャンセル

0

TableViewのCellは再利用されるので、そのコードだと動作しない場合もあるように思います。
(Cellの数にもよるかも) 

サムネイルを非表示にしたいタイミングが、セルのタップ時であれば、
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    _cell = [(UITableViewCell *)[(UITableView *)self cellForRowAtIndexPath:nowIndex] ;
_cell.thumbnailView.hidden = YES;

}
とかどうでしょう?


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/23 19:31

    申し訳ないです。解決できませんでした汗

    キャンセル

0

.h
@interface TimelineTableViewController : UITableViewController<UIScrollViewDelegate>

@end

.m
@interface TimelineTableViewController()
// 非ARC
@property (nonatomic, retain) Sample2TableViewCell *cell;
// ARC
@property (nonatomic, strong) Sample2TableViewCell *cell;

@end
@implementation TimelineTableViewController
// 非ARCのみ
@synthesize cell

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
~~
}
-(void)movieLoadStateDidChange:(id)sender{
~~
}
@end

こうじゃないですかね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

cellForRowAtIndexPathはテーブルの初期化の際にセルの個数だけ繰り返し実行されるメソッドです。
(breakpointを貼って実行するとindexの個数だけぐるぐる回ってきます。)
なのでここで起きているのは
_cell = index1のcell
_cell = index2のcell
_cell = index3のcell
...
...
_cell = index最後のcell
となり、最後のセルだけが_cellに代入されていることになります。
(なのでもしかしたら最後のセルのサムネイルだけ非表示になっていたり?)

これ以上は
・どういう操作をしたときに非表示にしたいのか?
・[ここが失敗する]というのはエラーになるのか?それともただ非表示にならないだけか?
などがわからないとなんとも言えません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

言語仕様はよく知りませんが、_cellと言う命名に問題はないのでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/23 11:15

    インスタンス変数にアンダースコアを付けることで、ローカル変数と見分けやすくするという手法があり、文法上、言語上は意味はないそうです!
    http://q.hatena.ne.jp/1335967529

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる