찾다

 >  Q&A  >  본문

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
巴扎黑巴扎黑2769일 전690

모든 응답(3)나는 대답할 것이다

  • 伊谢尔伦

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

    해야

    으아악

    질문의 A가 클래스 이름인데 어떻게 Delegate를 설정할 수 있나요?

    회신하다
    0
  • 大家讲道理

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

    질문의 의미를 잘 모르겠습니다. . . 전체 요구 사항과 코드를 게시하는 것이 좋습니다. 저는 귀하가 제공한 두 코드 조각을 서로 다른 상황에서 모두 사용했습니다. . . 모든 것이 가능합니다
    첫째, 나는 나의 이해에 따라 대의원의 지식을 대중화할 수 있을 뿐이다.
    먼저 delgate가 무엇인지 설명하겠습니다. delgate를 직역하면 에이전시(agency)라고 합니다.
    기능의 예:
    클래스 A에서 클래스 B를 제어하는 ​​코드를 구현하고, 클래스 B의 인스턴스 특성 위임을 클래스 A의 인스턴스로 설정합니다.

    으아아아

    델리게이트의 원리를 이해한 후, 질문에 나오는 코드를 살펴보겠습니다

    으아아아

    는 합리적이지만 Delegate를 초기화된 인스턴스로 설정하는 또 다른 작성 방식은 이상합니다(비록 이전에 사용한 적이 있지만 매우 특별한 경우입니다)
    viewDidLoad 문제에 대해 이야기해 보겠습니다. 이 함수는 전체 View가 초기화되고 로딩이 완료된 후 호출됩니다. 일반적으로 여기에 값을 할당하고 하위 뷰를 초기화합니다.

    보충

    몇 가지 질문이 있습니다
    1. 위임 클래스 이름에 예약어를 사용하지 마세요. 너무 이상해 보입니다.
    2. 대리자의 사용법은 LabelViewController에서 대리자 인스턴스를 정의한 다음 대리자 메서드
    를 호출하는 것입니다. 3. 델리게이트 구현은 ButtonViewController

    여야 합니다.

    코드는 다음과 같습니다.

    LabelViewController.h

    으아아아

    LabelViewController.m

    으아아아

    ButtonViewController.h

    으아아아

    ButtonViewController.m

    으아아아

    회신하다
    0
  • 巴扎黑

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

    Delegate의 의미를 이해했다면 Delegate의 사용법도 알게 될 것입니다.

    간단히 말하면 무슨 일이 생겨서 감당할 수 없어서 외부 세력의 도움이 필요했던 거죠. 예를 들어, 멀리 여행을 가고 싶다면 자동차, 기차, 비행기 등의 교통수단을 이용해야 하는 것은 절대 실용적이지 않습니다. 이러한 차량이 특정 프로토콜을 구현하는 한 차량의 메서드를 호출할 때 오류가 발생하지 않는 것이 보장됩니다.

    I.delegate = train과 같이 내가 주도적으로 대리자를 설정하는 경우. 틀린말은 아니지만 말도 안되고 대의원의 유연성도 없고 특정 차량에 묶여있습니다. 따라서 내 .delegate를 외부에서 설정해야 합니다. 나에게는 적절한 시간에 my.delegate.go를 실행하는 것만으로도 충분합니다. 대리인이 비행기라면 멋질 것입니다. Linke라면 그냥 받아들이십시오.

    회신하다
    0
  • 취소회신하다