0

複数のView Controllerを使用しており、デリゲートを使用して、あるView ControllerのUITextfieldを別のView Controllerのラベルにリンクしようとしています。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>
{
    IBOutlet UITextField *txtField;

}

@end

ViewController.m

#import "ViewController.h"
#import "ViewController2nd.h"


@interface ViewController ()

@end

@implementation ViewController

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{

    lbl.text = [NSString stringWithFormat:@"Hello, %@",txtField.text]
    [txtField resignFirstResponder];
    return YES;
}

@end

ViewController2nd.h

#import <UIKit/UIKit.h>

@interface ViewController2nd : UIViewController <UITextFieldDelegate> {

    IBOutlet UILabel *lbl;
}

@end

ViewController2nd.m

#import "ViewController2nd.h"

@interface ViewController2nd ()

@end

@implementation ViewController2nd

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

私が得るエラーは次のとおりです。

Viewcontroller.m での宣言されていない識別子 lbl の使用

この問題を解決する方法がわかりません。いくつかのガイダンスが必要..ありがとう...

4

5 に答える 5

1

ViewController2ndこのためのスコープ/超過IBOutlet UILabel *lbl;はありませんViewController。カスタムデリゲート、ViewControllerデリゲート、ViewController2ndおよびデータの返送が必要です。詳細については、この投稿をご覧ください。

于 2012-10-22T10:02:22.753 に答える
0

の宣言はlbl間違ったクラスで行われ IBOutlet UILabel *lbl; ます。viewcontroller.h

他のクラスの変数を使用したい場合は、コードを次のように変更してください。

#import <UIKit/UIKit.h>
#import "ViewController2.h"

@interface ViewController : UIViewController <UITextFieldDelegate>
{
    IBOutlet UITextField *txtField;
   ViewController2 *viewController2;

}
@property(nonatomic,retain)ViewController2 *viewController2;
@end

ViewController.m

#import "ViewController.h"
#import "ViewController2nd.h"


@interface ViewController ()

@end

@implementation ViewController
@synthesize viewcontroller2;
- (void)viewDidLoad
{
    viewController2 = [[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{

    viewController2.lbl.text = [NSString stringWithFormat:@"Hello, %@",txtField.text]
    [txtField resignFirstResponder];
    return YES;
}

@end

ViewController2nd.h

#import <UIKit/UIKit.h>

@interface ViewController2nd : UIViewController <UITextFieldDelegate> {

    IBOutlet UILabel *lbl;
}
@property(nonatomic,retain)IBOUTlet UILabel *lbl;
@end

ViewController2nd.m

#import "ViewController2nd.h"

@interface ViewController2nd ()

@end

@implementation ViewController2nd
@synthesize lbl;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
于 2012-10-22T10:05:46.610 に答える
0

シングルトンクラスを使用して、データをやり取りできます。たとえば、appDelegateクラスはシングルトンクラスです。そのクラスの共有インスタンスを使用して、データをやり取りできます。

例:

      Step 1: 

             yourAppDelegate.h

             @property (strong, nonatomic) NSString *txtLabelText;


             yourAppDelegate.m

             @synthesize txtLabelText;


      Step 2:

            viewController1.m

            #import viewController1.m
            #import yourAppDelegate.m

            -(void)viewDidLoad{

                 UILabel *txtLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,50,100,20)];

                  txtLabel.text = @"Rebel Yell";

                  yourAppDelegate *appDelegate = (yourAppDelegate *)[[UIApplication sharedApplication] delegate]; 

                  appDelegate.txtLabelText = txtLabel.text;                

               }



     Step 3:

                  viewController2.m

                  #import viewController2.m
                  #import yourAppDelegate.m

                  -(void)viewDidLoad{

                      yourAppDelegate *appDelegate = (yourAppDelegate*)[[UIApplication sharedApplication] delegate];

                      NSLog(@"Passed UILabel Text from viewController 1 %@", appDelegate.txtLabelText);

                     }

appDelegateクラスだけに依存するのではなく、カスタムシングルトンクラスを作成し、そのクラスの共有インスタンスを使用することをお勧めします。

これがいくつかの疑問を解決するのに役立つことを願っています

于 2012-10-23T05:21:46.567 に答える
0

エラーは正しい

lblとしてViewControllerに要素はありません:)

インスタンス プロパティにアクセスするには、ViewController2nd オブジェクトを使用する必要があります。

ここから、Objective-C を使用したオブジェクト指向プログラミングを開始できます。

于 2012-10-22T10:08:49.543 に答える
0

まず、 のオブジェクトを初期化する必要がありますViewController2nd

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
ViewController2nd *objeView2nd = [[ViewController2nd alloc]init];
objeView2nd.lbl.text = [NSString stringWithFormat:@"Hello, %@",txtField.text]
[txtField resignFirstResponder];
return YES;
}

もう 1 つ、lblofは and であるViewController2nd必要が@propertyあり@synthesizeます。これがないとアクセスできませんlbl

于 2012-10-22T10:17:32.637 に答える