2

ビューコントローラーとビューコントローラー2ndの2つのビューコントローラーがあります。それらの1つにUILabelがあり、viewcontroller2ndのボタン(Goという名前)がクリックされたときに変更したいと思います。私はそれを行うためにデリゲートとプロトコルを使用しています。

コードは次のようになります。

ViewController.h

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

@interface ViewController : UIViewController <SecondViewControllerDelegate>
{
    IBOutlet UILabel *lbl;
    ViewController2nd *secondview;

}
-(IBAction)passdata:(id)sender;

@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.
}
-(void) changeLabel:(NSString*)str{
    lbl.text = str;
}

-(IBAction)passdata:(id)sender{
    ViewController2nd *second = [[ViewController2nd alloc] initWithNibName:nil bundle:nil];
    [self presentViewController:second animated:YES completion:NULL];
}

@end

Viewcontroller2nd.h

#import <UIKit/UIKit.h>


@protocol SecondViewControllerDelegate <NSObject>
@optional
-(void) changeLabel:(NSString*)str;
@end

@interface ViewController2nd : UIViewController{

    IBOutlet UIButton *bttn;
    id <SecondViewControllerDelegate> delegate;

}

@property (retain) id delegate;

-(IBAction)bttnclicked;
-(IBAction)back:(id)sender;
@end

ViewController2nd.m

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

@interface ViewController2nd ()

@end

@implementation ViewController2nd

@synthesize delegate;

- (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.
}

-(IBAction)bttnclicked{
   [[self delegate] changeLabel:@"Hello"];
}

-(IBAction)back:(id)sender{
    [self dismissViewControllerAnimated:YES completion:NULL];
}

@end

2 つのビュー間でのコントロールの受け渡しは正しく機能しています。ただし、viewcontroller2nd で [go] ボタンをクリックしても、ラベルの値が Hello に変更されません。コードの何が問題になっていますか? いくつかのガイダンスが必要です。

4

5 に答える 5

2

デリゲートを設定したことがないようです。あなたの passData メソッドでそれを行うことができます:

-(IBAction)passdata:(id)sender{
    ViewController2nd *second = [[ViewController2nd alloc] initWithNibName:nil bundle:nil];
    second.delegate = self;
    [self presentViewController:second animated:YES completion:NULL];
}
于 2012-10-23T09:24:52.303 に答える
1

私はあなたのために以下を書きました!

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *label;

@end

#import "ViewController.h"
#import "ViewController2.h"

@interface ViewController () <ViewController2Delegate>

@end

@implementation ViewController

-(void)passdata:(NSString *)data
{
    self.label.text = data;
}

- (IBAction)buttonClicked:(id)sender {
    ViewController2 *v = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
    v.delegate = self;
    [self presentViewController:v animated:YES completion:nil];
}

@end

#import <UIKit/UIKit.h>

@protocol ViewController2Delegate <NSObject>

- (void)passdata:(NSString*)data;

@end

@interface ViewController2 : UIViewController

@property(assign, nonatomic) id<ViewController2Delegate> delegate;

@end

#import "ViewController2.h"

@interface ViewController2 ()

@end

@implementation ViewController2

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

- (IBAction)buttonClicked:(id)sender {
    [self.delegate passdata:@"hello"];
}

- (IBAction)backButtonClicked:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end
于 2012-10-23T09:48:42.980 に答える
1

うーん、changeLabelデリゲートメソッドで次のことを試してください。

-(void) changeLabel:(NSString*)str{
    lbl.text = str;
    [lbl setNeedsDisplay];
}

編集:

それ以外:あなたのレーベルはIBOutletですよね?ファイル所有者とのインターフェイスビルダーで、xibのラベルをIBOutletプロパティ(つまりlbl)に正しく接続しましたか?

于 2012-10-23T09:28:26.807 に答える
1

デリゲートを使用してこれを行う場合は、次passdataのように変更します。

 -(IBAction)passdata:(id)sender
  {
        ViewController2nd *second = [[ViewController2nd alloc] initWithNibName:nil bundle:nil];
        [second setDelegate:self];
        [self presentViewController:second animated:YES completion:NULL];
  }

デリゲートなしでこれを行うことができます。secondView で ViewController のオブジェクトを作成し、次のように合成するだけです。

#import "ViewController.h"
@interface ViewController2nd : UIViewController
{

    IBOutlet UIButton *bttn;
    ViewController  *parent;

}

@property (nonatomic, assign) ViewController  *parent;

-(IBAction)bttnclicked;
-(IBAction)back:(id)sender;
@end

そしてpassdata変化の中でそれは好きです

-(IBAction)passdata:(id)sender
{
    ViewController2nd *second = [[ViewController2nd alloc] initWithNibName:nil bundle:nil];
    [second setParent:self];
    [self presentViewController:second animated:YES completion:NULL];
}

bttnclicked次のように変更します。

-(IBAction)bttnclicked
{
   [parent changeLabel:@"Hello"];
}
于 2012-10-23T09:37:31.423 に答える
0
  • ViewController.h と ViewController.m の両方にヘッダー「ViewController2nd.h」をインポートする必要はありません。
  • @property (強力、非アトミック) のようなプロパティなしで UILabel を宣言します。
  • おそらく、UILabel を .storyboard または .xib ファイルに適切にマッピングしていません。
  • コントローラーの呼び出し中に 2 番目のビュー コントローラー デリゲートを割り当てるのを忘れた

    ViewController2nd *second = [[ViewController2nd alloc] initWithNibName:nil bundle:nil];
    second.delegate = self;
    [self presentViewController:second animated:YES completion:NULL];
    

誰かがビューコントローラーのナビゲーションにストーリーボードを使用している場合。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier hasPrefix:@"view_to_capture"]) {
            ViewController2nd *destination = segue.destinationViewController;
            destination.delegate = self;
        }
    }
于 2016-02-11T10:19:15.807 に答える