1

私はかなり iPhone SDK に慣れていないので、この答えがばかげて明白である場合はご容赦ください。

.xib ファイルに接続された ViewController があります (それらは FirstViewController と呼ばれます)

MyCustomClass というカスタム クラスもあります。このクラスには、次のようなメソッドがあります。

- (void)setTheText {
    [myLabel setText:@"foo"];
}

このメソッドを呼び出して、FirstViewController.xib のラベルにテキストを設定したい

これまでのところ、私はこれを行ってきました:

「オブジェクト」を Interface Builder にドラッグし、クラスを次のように設定します。 MyCustomClass IBOutlet 'myLabel' を MyCustomClass からビューの UILabel に接続しました。

ただし、プログラムを実行し、ボタンを押してラベル (FirstViewController.m にあります) を設定すると、次のようになります。

- (IBAction)doSomething:(id)sender {
   MyCustomClass *customClass = [MyCustomClass alloc] init];
   [customClass setTheText];
}

ただし、これは設定されません。NSLog(@"%@",[myLabel text]);戻り値 (null)

Xcode にエラーや警告が表示されません。何が問題なのですか?

ありがとう、

マイケル

追加情報:

MyCustomClass.h へのインターフェイス:

#import <UIKit/UIKit.h>

@interface MyCustomClass : NSObject {
    UILabel *myLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *myLabel;

- (void)setTheText;

@end
4

4 に答える 4

3

アクションメソッドでカスタムクラスの新しいインスタンスを作成する必要はありません。

やりたいことをする方法はいくつかあります。

オプション1は、ViewControllerにカスタムオブジェクトへの参照を与えることです。これを行うにはMyCustomClass *、View Controllerでタイプのアウトレットを作成し、そのアウトレットをXIBファイルで作成した新しいオブジェクトに接続してから、アクションメソッドの割り当てを削除します。

- (IBAction)doSomething:(id)sender {       
    [customClass setTheText];
}

オプション2CustomClass、ラベルアクションメソッドの両方を処理できるようにすることです。これを行うには、物事をさらに単純化することができます。のアウトレットをに入れてUILabelから、メソッドをアクションにCustomClass変換します。setTheText

- (IBAction)setTheText:(id)sender {
    [myLabel setText:@"foo"];
}

次に、そのアクションをボタンに接続すると、すべてが魅力のように機能するはずです。

注: CocoaのKVC / KVOシステムの一部としてプロパティセッターに一般的に使用されるため、「set」で始まらないメソッド名を使用する必要があります。changeLabel代わりに、または同等のものと呼びます。

于 2010-01-21T20:43:20.297 に答える
2

UILabelには、値を設定するためのtextというプロパティもあります。これは簡単な場合があります。

myObject.myLabel.text = @"Your text";
于 2010-01-21T20:39:25.187 に答える
2

ここでの customClass のインスタンスは、NIB とはまったく関係ありません。+alloc を使用して新しいオブジェクトをインスタンス化しました。NIB 内の特定の MyCustomClass を変更する場合、FirstViewController にはそれを指す IBOutlet が必要です。

于 2010-01-21T20:30:50.460 に答える
0

最初に非 ibaction、次にプロパティ内の ibaction です。

于 2011-08-17T20:22:57.693 に答える