2

ビューコントローラを備えたビューがあり、このビューを画面に表示するときに、呼び出し元のクラスから変数を渡して、ラベルなどの値を設定できるようにしたいです。

まず、ラベルの1つにプロパティを作成し、それを呼び出し元のクラスから呼び出してみました。例えば:

SetTeamsViewController *vc = [[SetTeamsViewController alloc] init];
vc.myLabel.text = self.teamCount;
[self presentModalViewController:vc animated:YES];
[vc release];

しかし、これはうまくいきませんでした。そこで、便利なイニシャライザーを作成してみました。

SetTeamsViewController *vc = [[SetTeamsViewController alloc] initWithTeamCount:self.teamCount];

そして、SetTeamsViewController私は持っていました

- (id)initWithTeamCount:(int)teamCount {
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        // Custom initialization
        self.teamCountLabel.text = [NSString stringWithFormat:@"%d",teamCount];
    }
    return self;
}

しかし、これもうまくいきませんでした。nibファイルにラベルを付けた値をロードするだけです。コードにsを散らかしましたがNSLog()、正しい変数値が渡されています。ラベルが設定されていないだけです。

どんな助けでも大歓迎です。

編集:指定した初期化子でインスタンス変数を設定してから、viewDidLoadでラベルを設定しようとしましたが、これでうまくいきます!これはこれを行うための最良の方法ですか?

また、このモーダルView Controllerを閉じるときに、呼び出し元のViewControllerのビューのボタンのテキストも更新します。ただし、他のビューが画面上でアニメーション化されているときにこのボタンをもう一度押すと(モーダルビューを再度表示するため)、ボタンは一時的に元の値に戻ります(ペン先から)。なぜこれなのか誰か知っていますか?

4

8 に答える 8

6

私はプロではありませんが、これはあなたを助けるかもしれません。

headerview1.hで、目的のプロパティを宣言します。

// view1.h

@interface view1 : UIViewController {
    NSString *passingVariable;
}

@property (nonatomic, strong) NSString *passingVariable;

@end

次に、 の実装でview1、変数を合成します。

// view1.m

@implementation view1

@synthesize passingVariable;

// the rest of the implementation

@end

最後に、もう一方のビュー コントローラー view2 の実装で:

// view2.m

#import "view1.h"

@implementation view2

-(IBAction)changeview
{
    view1 *myview = [[view1 alloc] init];

    myview.passingVariable = @"Hello Variable";

    [self.navigationController pushViewController:myview animated:YES];
}

@end

ここで私はview2からビュー 1に移動しようとしていますview1。これがあなたを助けることを願っています。

于 2012-06-30T10:18:00.157 に答える
6

ビュー コントローラが初期化されているとき、initWithNibName メソッド内で、ビュー コントローラに存在するビューはまだ初期化されておらず、それらのプロパティをまだ設定できません。「viewDidLoad」メソッドに基づくビューで必要なことは何でも行います。

于 2012-06-30T09:11:42.623 に答える
3

ここでは、ViewController のラベル テキストを SecondViewController のラベル テキストに渡しています。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    // please make your control on XIB set these IBOutlet's
    //I'm not showing how to connect these with XIB

    IBOutlet UILabel *lblView;
    IBOutlet UIButton *buttonGo;   
}
//this is method which will push the view
-(IBAction)buttonGoClickAction:(id)sender;

ViewController.m

-(IBAction)buttonGoClickAction:(id)sender
{
    SecondViewController *secondViewObject = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
    //before pushing give the text
    secondViewObject.string = lblView.text;
    [self.navigationController pushViewController:secondViewObject animated:YES];
}

SecondViewController.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController
{
    IBOutlet UILabel *labelView;
    NSString *string;
}
//set the string property
@property(nonatomic, retain) NSString *string;

@end

SecondViewController.m

 #import "SecondViewController.h"

 @implementation SecondViewController
 //synthesize string here
 @synthesize string;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    //Here you will get the string 
    labelView.text = string;
}
于 2012-06-30T14:02:03.647 に答える
2

stavash が言ったように、xib のコントロールは読み込まれたビューで作成されます。より正確には、次の行で作成されます。

    [super viewDidLoad];

そのため、mylabel はその時点より前には存在しません (nil です)。

最も簡単な方法はそれを行うことです:

    SetTeamsViewController *vc = [[SetTeamsViewController alloc] init];
    [self presentModalViewController:vc animated:YES];
    vc.myLabel.text = self.teamCount;
    [vc release];

より長いがより正しいパスは、SetTeamsViewController クラスにメンバー NSString* を持ち、ウィンドウを表示する前にそれを teamCount に設定し、ビューでロードしてそのメンバー値をラベルに入れることです。

Cdt

于 2012-06-30T11:28:26.407 に答える
2

まず、Interface Builder で作成した場合は、このラベル IBOutlet が xib に添付されているかどうかを確認します....

このように使用してください....

SetTeamsViewController *vc = [[SetTeamsViewController alloc] initWithTeamCount:teamCount];

.h ファイルで文字列変数を取得し、その文字列をここに設定します.. NSSting *str in .h

- (id)initWithTeamCount:(int)teamCount {
    self = [super init];
    if (self) {
        // Custom initialization
       str = [NSString stringWithFormat:@"%d",teamCount];
    }
    return self;
 }

viewDidLoad:またはviewWillApear:でラベルを設定します。

 self.teamCountLabel.text = str;

これがあなたを助けるかもしれません

于 2012-06-30T11:19:42.117 に答える
1

それはあなたの必要性に依存します。Singletonクラスを使用して、異なるクラス間で変数を共有できます。DataClass で共有するすべての変数を定義します。

.h ファイル (RootViewController が私の DataClass である場合、名前を新しいクラスに置き換えます)

+(RootViewController*)sharedFirstViewController; 

.m ファイルで

//make the class singleton:-    
+(RootViewController*)sharedFirstViewController    
{    
    @synchronized([RootViewController class])
     {
        if (!_sharedFirstViewController)
            [[self alloc] init];

        return _sharedFirstViewController;
    }

    return nil;
}


+(id)alloc
{
    @synchronized([RootViewController class])
    {
        NSAssert(_sharedFirstViewController == nil, 
                 @"Attempted to allocate a second instance of a singleton.");
        _sharedFirstViewController = [super alloc];
        return _sharedFirstViewController; 
    }
    return nil;
}

-(id)init {
    self = [super init];
    if (self != nil) {
        // initialize stuff here
    }
    return self;
}

その後、このような他のクラスで変数を使用できます

[RootViewController sharedFirstViewController].variable

それがあなたを助けることを願っています:)

于 2012-06-30T09:21:31.127 に答える
1

ストーリーボードを使用する正しい方法は、indexPath を performSegueWithIdentifier の送信者引数として渡すことです。

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

    [self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath];

}

宛先コントローラーでプロパティを設定するには、次のようにします。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString: @"segueIdentifier"]) {

        NSIndexPath *indexPath = sender;

        DetailViewController *dest = [segue destinationViewController];

        dest.usersArray = [self.usersArray objectAtIndex:indexPath.row];

    }
}
于 2012-10-19T01:15:57.947 に答える
0

以前のクラスの変数を持つために別のクラスが必要になったときに行ったことは、より多くの場所で値が必要な場合に備えて値を格納するグローバル クラスを設定するか、@public 変数を設定できるインターフェイスです。これらの変数は、次のビュー用に作成したコントローラーを使用して設定できます。

controller->pub_var1 = val1; controller->pub_var2 = val2;

これは、ビューをルート コントローラーに渡す前、または次のビューを呼び出す直前に行われます。これらのパブリック変数にアクセスできるように、#import "class.h" が必要になります。

これが明確でない場合は、コードを表示できます

于 2012-08-01T18:49:55.547 に答える