recherche

Maison  >  Questions et réponses  >  le corps du texte

objective-c - 这两个delegate的用法效果是一样的吗?

比如A,B两个view,值从A传到B。

在B里面写

A *av = [[A alloc]init];
[av setDelegate:self]

和在A里面写

B *bv = [[B alloc]init];
[self setDelegate:bv];

这句setDelegate要放哪里呢?viewDidLoad?没有报错,但是就是传值不成功。能给我一点提示吗?

代码

#import <Foundation/Foundation.h>

@protocol delegate <NSObject>

-(void)passString:(NSString *)string;

@end
#import <UIKit/UIKit.h>
#import "labelViewController.h"
#import "delegate.h"

@interface buttonViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UIButton *button;
@property (weak,nonatomic) id <delegate> delegate;

- (IBAction)buttonPress:(UIButton *)sender;

@end
#import "buttonViewController.h"

@interface buttonViewController ()

@end

@implementation buttonViewController

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

- (void)viewDidLoad
{
	labelViewController *lv = [[labelViewController alloc]init];
	[self setDelegate:lv];
        [super viewDidLoad];

	// Do any additional setup after loading the view.
}

- (IBAction)buttonPress:(UIButton *)sender {

	[self.delegate passString:sender.currentTitle];
	[self performSegueWithIdentifier:@"push" sender:self];
}

@end
#import <UIKit/UIKit.h>
#import "delegate.h"


@interface labelViewController : UIViewController <delegate>

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

@end
#import "labelViewController.h"

@interface labelViewController ()

@end

@implementation labelViewController

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

- (void)passString:(NSString *)string{
	self.label.text = string;
		NSLog(@"%@",self.label.text);
}


@end
巴扎黑巴扎黑2865 Il y a quelques jours731

répondre à tous(3)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-04-21 10:59:26

    devrait être

    A *av = [A alloc]init];
    [av setDelegate:self]

    Eh bien, A dans la question est un nom de classe, comment puis-je définir Delegate ?

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-21 10:59:26

    Je ne comprends pas très bien ce que signifie la question. . . Je vous suggère de publier les exigences complètes et le code. J'ai utilisé les deux extraits de code que vous avez fournis dans différentes situations. . . Tout est possible
    Premièrement, je ne peux que vulgariser les connaissances du délégué selon ma compréhension.
    Laissez-moi d'abord vous expliquer ce qu'est delgate. La traduction littérale de delgate s'appelle agence.
    Un exemple de sa fonction :
    Implémentez le code qui contrôle la classe B dans la classe A et définissez le délégué d'attribut d'instance de la classe B sur une instance de la classe A.

    @@implementation A
    - (void)viewDidLoad
    {
        UITableView *b;
        b.delegate = self; // 这个self就是A的实例
    }
    
    // 这就是一个Delgate方法,本来是控制UITableView的,但是在A中实现,通过UITableView的实例b的属性delegate联系起来。
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44.f;
    }
    
    @end

    Après avoir compris le principe du délégué, regardons le code dans votre question

    A *av = [[A alloc]init];
    [av setDelegate:self]

    est raisonnable, mais une autre façon d'écrire, définir le délégué sur une instance initialisée est bizarre (même si je l'ai déjà utilisé, mais c'est un cas très particulier)
    Parlons du problème de viewDidLoad. Cette fonction est appelée une fois la vue entière initialisée et le chargement terminé. Généralement, vous attribuez des valeurs ici et initialisez les sous-vues.

    Supplément

    Il y a quelques questions
    1. Essayez de ne pas utiliser de mots réservés dans le nom de la classe des délégués, cela semble trop bizarre
    2. L'utilisation de délégué consiste à définir une instance de délégué dans LabelViewController, puis à appeler la méthode délégué
    3. L'implémentation du délégué doit être ButtonViewController

    Le code est le suivant :

    LabelViewController.h

    #import <Foundation/Foundation.h>
    
    @protocol LabelDelegate <NSObject>
    
    -(NSString *)passString;
    
    @end
    
    @interface labelViewController : UIViewController <delegate>
    
    - (void)pass;
    
    @property (weak, nonatomic) IBOutlet UILabel *label;
    @property (assign, nonatomic) id<LabelDelegate> delegate;
    
    @end

    LabelViewController.m

    #import "LabelViewController.h"
    
    @interface LabelViewController ()
    
    @end
    
    @implementation LabelViewController
    
    - (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.
    }
    
    - (void)pass {
        if ([self.delegate respondsToSelector:@selector(passString)]) {
            self.label.text = [self.delegate passString];
        }
    }
    
    @end

    ButtonViewController.h

    #import <UIKit/UIKit.h>
    #import "LabelViewController.h"
    
    @interface ButtonViewController : UIViewController <LabelDelegate>
    
    @property (weak, nonatomic) IBOutlet UIButton *button;
    @property (strong, nonatomic) LabelViewController *lv;
    
    - (IBAction)buttonPress:(UIButton *)sender;
    
    @end

    ButtonViewController.m

    #import "ButtonViewController.h"
    
    @interface ButtonViewController ()
    
    @end
    
    @implementation ButtonViewController
    
    @synthesize lv;
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
            [super viewDidLoad];
    
            self.lv = [[LabelViewController alloc] init];
            [lv setDelegate:self];
    
            // Do any additional setup after loading the view.
    }
    
    - (NSString *)passString
    {
        return self.button.currentTitle;
    }
    
    - (IBAction)buttonPress:(UIButton *)sender {
        [self.lv pass];
    }
    
    @end

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-21 10:59:26

    Si vous comprenez la signification de délégué, vous saurez comment utiliser délégué.

    Pour faire simple, quelque chose s’est produit et je ne pouvais pas le gérer, j’ai donc dû utiliser des forces extérieures. Par exemple, si je veux voyager loin, ce n’est certainement pas pratique. Dans ce cas, je dois utiliser des moyens de transport, comme les voitures, les trains et les avions. Tant que ces véhicules implémentent un certain protocole, il est garanti qu'il n'y aura pas d'erreur lors de l'appel d'une méthode du véhicule.

    Si je prends l'initiative de définir le délégué, tel que : I.delegate = train. Ce n'est pas faux, mais cela n'a aucun sens. La flexibilité du délégué n'existe pas et je suis lié à un certain véhicule. Mon .delegate doit donc être défini en externe. Pour moi, il suffit d'exécuter my.delegate.go au moment opportun. Ce serait cool si le délégué était un avion. Si c'était un Linke, acceptez-le.

    répondre
    0
  • Annulerrépondre