2017-05-03 10 views
0

タイトルの名前を正しく指定する必要はありませんが、問題が何であるかはわかります。他のクラスのインスタンスを作成する

私はObjective-Cの新機能で、まだ学習中です。

私はtableView(ClassAと呼ぶ)と通常のUIView(ClassB)を持つクラスを持っています。私がやりたいことは、行が選択されたときにボタンを表示させることです。

私はClassB.hファイルで作成された

+(id)sharedInstance; 
@property (retain, nonatomic) IBOutlet UIButton *btn; 
-(void) showBtn :(BOOL) show; 

そして、私のClassB.mファイル内:

@synthesize btn; 

static ClassB *this = nil; 

(+id) sharedInstance { 

    if(!this) { 
     @synchronized (self) { 
      this = [[ClassB alloc] init]; 
     } 
    } 
    return this; 
} 

-(void)viewDidLoad { 

    [self showBtn:NO] //because I only want to let it appear when a row is selected. 
    [self.view addSubview:btn]; 

} 

-(void) showBtn :(BOOL) show { // I called this method in classA. 


    if (show == NO) { 
     btn.hidden = YES; 
    } else { 
     btn.hidden = NO; 
    } 
} 

私は私のアプリを起動するときに、ボタンが隠されているとするときに隠されたままになります私は行を選択します。私はデバッグを行い、ClassAでメソッドを呼び出すとbtnがnilであることがわかりました。いくつかの研究の後、このメソッドが別のインスタンスのために呼び出されていることが分かりました。そこでここで私の質問、私は何ができますか?私ClassA.mの

EDITここ

一部

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSInteger row = [indexPath row]; 

    [[ClassB sharedInstance] showBtn:YES]; 
} 
+0

不可能なビューに 'showBtn'メソッドを追加しています。おそらく '[self.view addSubview:btn];を意味するでしょう。あまり秘密のない名前を使うと、それらの間違いを避けることができます。 – vadian

+0

どのようにインスタンスを作成していますか? – Priyal

+0

申し訳ありませんが、入力ミスでした。それはbtnです。私はここでそれらをより一般的にするために名前を簡略化しました –

答えて

0

観察: ClassBのは間違っているのUIViewControllerです。 UIViewControllersviewDidLoadです。

実装提案:

要件の正しい実装はあなたがボタンでカスタムセルを作成することになります。 awakeFromNibメソッドのボタンを非表示にします。 didSelectRowAtIndexcell.button.isHidden = YESを設定します。

これは、上記の要件を単独で処理する必要があります。

+0

事は、ClassAはコンテナにありますClassBのビューとボタンはClassBになければなりません –

関連する問題