比如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
大家讲道理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
으아아아巴扎黑2017-04-21 10:59:26
Delegate의 의미를 이해했다면 Delegate의 사용법도 알게 될 것입니다.
간단히 말하면 무슨 일이 생겨서 감당할 수 없어서 외부 세력의 도움이 필요했던 거죠. 예를 들어, 멀리 여행을 가고 싶다면 자동차, 기차, 비행기 등의 교통수단을 이용해야 하는 것은 절대 실용적이지 않습니다. 이러한 차량이 특정 프로토콜을 구현하는 한 차량의 메서드를 호출할 때 오류가 발생하지 않는 것이 보장됩니다.
I.delegate = train과 같이 내가 주도적으로 대리자를 설정하는 경우. 틀린말은 아니지만 말도 안되고 대의원의 유연성도 없고 특정 차량에 묶여있습니다. 따라서 내 .delegate를 외부에서 설정해야 합니다. 나에게는 적절한 시간에 my.delegate.go를 실행하는 것만으로도 충분합니다. 대리인이 비행기라면 멋질 것입니다. Linke라면 그냥 받아들이십시오.