1

どのクラスが他のクラスのどの変数を読み取ることができるかを理解するのに苦労しています。私はオンラインでさまざまなことを読んできましたが、ここでしっかりしたものを見つけることができないようです。プログラムを機能させるために過去 2 日間を文字通り無駄にしましたが、どのクラスも他のクラス変数を読み取ることができません。どんな助けでも大歓迎です。

これは私の ViewController.h です:

@interface ViewController : UIViewController
{
    @public
    NSString *nameOfLabel;
}

@property (strong, nonatomic) IBOutlet UILabel *firstLabel;
- (IBAction)Switch:(id)sender;
- (IBAction)changeLabel:(UIButton *)sender;
-(NSString *) nameOfLabel;
@end

nameOfLabel はパブリック変数であり、外部クラスからアクセスできるはずですよね?

ViewController.m:

#import "ViewController.h"
#import "NewView.h"

@interface ViewController ()
@end

@implementation ViewController

- (IBAction)Switch:(id)sender {
    NewView * new = [[NewView alloc] initWithNibName:nil bundle:nil];
    [self presentViewController: new animated:YES completion:NULL];
}
- (IBAction)changeLabel:(UIButton *)sender  {
    nameOfLabel = @"Test Name";
    _firstLabel.text = nameOfLabel;
}
-(NSString *) nameOfLabel   {
    return nameOfLabel;
}
@end

changeLabel ボタンは *firstLabel.text を「テスト名」に変更します。

2 番目のクラスは NewView.h です。

#import "ViewController.h"

    @interface NewView : UIViewController
    @property (strong, nonatomic) IBOutlet UILabel *secondLabel;
    - (IBAction)changeSecondLabel:(UIButton *)sender;
    @end

および NewView.m:

#import "NewView.h"

@interface NewView ()
@end

@implementation NewView
{
    ViewController *view;
}
- (IBAction)changeSecondLabel:(UIButton *)sender {
    view = [[ViewController alloc] init];
    _secondLabel.text = view.nameOfLabel;
}
@end

changeSecondLabel は、secondLabel.text を「テスト名」である nameOfLabel に変更する必要がありますが、実際にはラベルが消えてしまい、nameOfLabel に到達できないと思われます。nameOfLabel をいじって、それを @property にして合成し、{ NSString *nameOfLabel; に入れてみました。@implementation の下ですが、それでも同じ結果が得られます。

4

4 に答える 4

0

public ivar へのアクセスの簡単なデモンストレーションが必要な場合、構文は次のとおりです。

view->nameOfLabel;
    ^^

ドット構文ではない:

view.nameOfLabel;

(ドット構文は、アクセサー メソッドを通過するだけです)。

私は何年にもわたって、ほんの一握りの保証されたエッジケースしか見たことがありません。ivar を public にする正当な理由があることはめったにありません (また、protected が適切な選択であることもめったにありません)。

于 2012-11-06T21:22:28.043 に答える
0

まず、コーディング標準について読んでください。次のことはお勧めできません。

  1. 「new」などの変数に名前を付ける

  2. 「Switch」などのメソッドに名前を付ける

  3. 「view」や「NewView」のようにUIViewControllerに名前を付けます

ロジックについて:これはすべてめちゃくちゃです。実際に行うことは、空でボタンを押したときにのみ変更されるnameOfLabelでviewControllerを作成することです。あなたがそのボタンを押したので、変更されたと思います。次に、スイッチ アクションで、別の viewController を作成して表示します。次に、その新しいviewController内から、空のnameOfLabelを持つ別の新しいviewControllerを作成し、この空の値を取得してsecondLabel内に配置します。

secondLabel を変更するには、いくつかの方法があります。

  1. nameOfLabel を model に移動して、secondLabel を変更したいときにそこから読み込み、
  2. 新しいviewControllerはnameOfLabelを保持するviewControllerの子であるため、[[self presentingViewController] nameOfLabel]を呼び出すことでアクセスできますが、最初にプロパティにします。
  3. 指定された初期化子を介して nameOfLabel を渡します。
于 2012-11-06T20:52:15.283 に答える
0

2 番目のビュー コントローラー (NewView) が表示されると、最初のビュー コントローラー (ViewController) への参照はなく、データです。

ここにいくつかの提案があります。

  • 現代の Objective-C では、変数を公開する代わりにプロパティを使用することをお勧めします。
  • 一般的にネーミングを見てください。たとえば、「ViewController」は適切な名前ではありません。
  • プロパティがクラスの内部状態の一部である場合は、クラス拡張で宣言します。
  • 2 番目のビュー コントローラーを提示する前に、最初のビュー コントローラーからの文字列への参照を設定します。

ViewController.m の一部:

@interface ViewController ()
@property (copy,nonatomic) NSString *nameOfLabel;
@end

@implementation ViewController

- (IBAction)Switch:(id)sender {
    NewView *new = [[NewView alloc] initWithNibName:nil bundle:nil];
    new.secondLabel.text = self.nameOfLabel;
    [self presentViewController: new animated:YES completion:NULL];
}
于 2012-11-06T20:52:38.340 に答える
0

この行:他の ViewController に対して行った可能性があることについて何も知らない新しいview = [[ViewController alloc] init];ViewController を作成します。あなたの場合、この新しいViewControllerが存在する前に別のViewControllerで呼び出されたことを特に知りません。changeLabel:

于 2012-11-06T20:48:11.593 に答える