2개의 뷰 컨트롤러 간에 통신하도록 단순 대리인을 설정하려면 어떻게 해야 합니까?
난 두 개가 있다.UITableViewControllers
위임자를 사용하여 하위 뷰 컨트롤러에서 부모에게 값을 전달해야 합니다.나는 대표자들이 무엇인지 알고 있으며 단지 단순하고 따르기 쉬운 예를 보고 싶었다.
감사해요.
다음은 간단한 예입니다.
아이 뷰 컨트롤러에UISlider
대리인을 통해 슬라이더 값을 부모에게 돌려주려고 합니다.
하위 보기 컨트롤러의 헤더 파일에서 위임 유형 및 방법을 선언하십시오.
ChildViewController.h
#import <UIKit/UIKit.h>
// 1. Forward declaration of ChildViewControllerDelegate - this just declares
// that a ChildViewControllerDelegate type exists so that we can use it
// later.
@protocol ChildViewControllerDelegate;
// 2. Declaration of the view controller class, as usual
@interface ChildViewController : UIViewController
// Delegate properties should always be weak references
// See http://stackoverflow.com/a/4796131/263871 for the rationale
// (Tip: If you're not using ARC, use `assign` instead of `weak`)
@property (nonatomic, weak) id<ChildViewControllerDelegate> delegate;
// A simple IBAction method that I'll associate with a close button in
// the UI. We'll call the delegate's childViewController:didChooseValue:
// method inside this handler.
- (IBAction)handleCloseButton:(id)sender;
@end
// 3. Definition of the delegate's interface
@protocol ChildViewControllerDelegate <NSObject>
- (void)childViewController:(ChildViewController*)viewController
didChooseValue:(CGFloat)value;
@end
하위 보기 컨트롤러의 구현에서 필요에 따라 위임 메서드를 호출합니다.
ChildViewController.m
#import "ChildViewController.h"
@implementation ChildViewController
- (void)handleCloseButton:(id)sender {
// Xcode will complain if we access a weak property more than
// once here, since it could in theory be nilled between accesses
// leading to unpredictable results. So we'll start by taking
// a local, strong reference to the delegate.
id<ChildViewControllerDelegate> strongDelegate = self.delegate;
// Our delegate method is optional, so we should
// check that the delegate implements it
if ([strongDelegate respondsToSelector:@selector(childViewController:didChooseValue:)]) {
[strongDelegate childViewController:self didChooseValue:self.slider.value];
}
}
@end
상위 뷰 컨트롤러의 헤더 파일에서 컨트롤러가 구현되었음을 선언합니다.ChildViewControllerDelegate
프로토콜입니다.
RootViewController.h
#import <UIKit/UIKit.h>
#import "ChildViewController.h"
@interface RootViewController : UITableViewController <ChildViewControllerDelegate>
@end
부모 뷰 컨트롤러의 구현에서는 위임 방법을 적절하게 구현합니다.
RootViewController.m
#import "RootViewController.h"
@implementation RootViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ChildViewController *detailViewController = [[ChildViewController alloc] init];
// Assign self as the delegate for the child view controller
detailViewController.delegate = self;
[self.navigationController pushViewController:detailViewController animated:YES];
}
// Implement the delegate methods for ChildViewControllerDelegate
- (void)childViewController:(ChildViewController *)viewController didChooseValue:(CGFloat)value {
// Do something with value...
// ...then dismiss the child view controller
[self.navigationController popViewControllerAnimated:YES];
}
@end
아래 코드는 대리자 개념의 매우 기본적인 사용법을 보여줍니다.요구 사항에 따라 변수와 클래스의 이름을 지정합니다.
먼저 프로토콜을 선언해야 합니다.
My First Controller Delegate라고 합니다.h
@protocol MyFirstControllerDelegate
- (void) FunctionOne: (MyDataOne*) dataOne;
- (void) FunctionTwo: (MyDatatwo*) dataTwo;
@end
MyFirstControllerDelegate.h 파일을 Import하고 MyFirstControllerDelegate 프로토콜을 사용하여 FirstController를 확인합니다.
#import "MyFirstControllerDelegate.h"
@interface FirstController : UIViewController<MyFirstControllerDelegate>
{
}
@end
구현 파일에서는 프로토콜의 두 기능을 모두 구현해야 합니다.
@implementation FirstController
- (void) FunctionOne: (MyDataOne*) dataOne
{
//Put your finction code here
}
- (void) FunctionTwo: (MyDatatwo*) dataTwo
{
//Put your finction code here
}
//Call below function from your code
-(void) CreateSecondController
{
SecondController *mySecondController = [SecondController alloc] initWithSomeData:.];
//..... push second controller into navigation stack
mySecondController.delegate = self ;
[mySecondController release];
}
@end
세컨드 컨트롤러:
@interface SecondController:<UIViewController>
{
id <MyFirstControllerDelegate> delegate;
}
@property (nonatomic,assign) id <MyFirstControllerDelegate> delegate;
@end
Second Controller의 구현 파일.
@implementation SecondController
@synthesize delegate;
//Call below two function on self.
-(void) SendOneDataToFirstController
{
[delegate FunctionOne:myDataOne];
}
-(void) SendSecondDataToFirstController
{
[delegate FunctionTwo:myDataSecond];
}
@end
여기 대표자에 대한 위키 기사가 있습니다.
다음 솔루션은 delegate를 사용하여 VC2에서 VC1로 데이터를 전송하는 매우 기본적이고 간단한 방법입니다.
PS: 이 솔루션은 Xcode 9.X 및 Swift 4에서 제조됩니다.
프로토콜을 선언하고 ViewControllerB에 위임 var를 생성했습니다.
import UIKit
//Declare the Protocol into your SecondVC
protocol DataDelegate {
func sendData(data : String)
}
class ViewControllerB : UIViewController {
//Declare the delegate property in your SecondVC
var delegate : DataDelegate?
var data : String = "Send data to ViewControllerA."
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnSendDataPushed(_ sender: UIButton) {
// Call the delegate method from SecondVC
self.delegate?.sendData(data:self.data)
dismiss(animated: true, completion: nil)
}
}
ViewController A가 프로토콜을 확인하고 위임 메서드 sendData를 통해 데이터를 수신해야 합니다.
import UIKit
// Conform the DataDelegate protocol in ViewControllerA
class ViewControllerA : UIViewController , DataDelegate {
@IBOutlet weak var dataLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func presentToChild(_ sender: UIButton) {
let childVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier:"ViewControllerB") as! ViewControllerB
//Registered delegate
childVC.delegate = self
self.present(childVC, animated: true, completion: nil)
}
// Implement the delegate method in ViewControllerA
func sendData(data : String) {
if data != "" {
self.dataLabel.text = data
}
}
}
대리인과 프로토콜을 사용해야 합니다.다음은 예를 들어 http://iosdevelopertips.com/objective-c/the-basics-of-protocols-and-delegates.html 를 사용하는 사이트입니다.
언급URL : https://stackoverflow.com/questions/6168919/how-do-i-set-up-a-simple-delegate-to-communicate-between-two-view-controllers
'source' 카테고리의 다른 글
대신 아이콘 태그를 사용해야 합니까? (0) | 2023.04.12 |
---|---|
SQL Server management studio에서 DATETIME을 사용하여 삽입하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
변수의 값을 명령어의 표준 입력에 전달하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
WPF에서 "Capture the mouse"는 무엇을 의미합니까? (0) | 2023.04.12 |
바인딩으로 인해 WPF에서 메모리 누수가 발생할 수 있습니까? (0) | 2023.04.12 |