मेरे पास दो हैं UITableViewControllers
और एक प्रतिनिधि का उपयोग करके चाइल्ड व्यू कंट्रोलर से माता-पिता के लिए मूल्य पारित करने की आवश्यकता है। मुझे पता है कि प्रतिनिधि क्या हैं और उदाहरण का पालन करने के लिए बस एक सरल देखना चाहते हैं।
धन्यवाद
मेरे पास दो हैं 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
उम्मीद है की यह मदद करेगा!
detailViewController.delegate = self;
(यह -tableView:didSelectRowAtIndexPath:
उपरोक्त कोड स्निपेट में है।
यह नीचे दिए गए कोड में केवल प्रतिनिधि अवधारणा का बहुत बुनियादी उपयोग दिखाया गया है .. आप अपनी आवश्यकता के अनुसार चर और वर्ग का नाम देते हैं।
पहले आपको एक प्रोटोकॉल घोषित करने की आवश्यकता है:
चलो इसे MyFirstControllerDelegate.h कहते हैं
@protocol MyFirstControllerDelegate
- (void) FunctionOne: (MyDataOne*) dataOne;
- (void) FunctionTwo: (MyDatatwo*) dataTwo;
@end
MyFirstControllerDelegate.h फ़ाइल आयात करें और प्रोटोकॉल के साथ अपने FirstController की पुष्टि करें MyFirstControllerDelegate
#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
SecondController के कार्यान्वयन फ़ाइल में ।
@implementation SecondController
@synthesize delegate;
//Call below two function on self.
-(void) SendOneDataToFirstController
{
[delegate FunctionOne:myDataOne];
}
-(void) SendSecondDataToFirstController
{
[delegate FunctionTwo:myDataSecond];
}
@end
यहाँ प्रतिनिधि पर विकि लेख है।
निम्नलिखित समाधान डेलिगेट का उपयोग करके VC2 से VC1 तक डेटा भेजने के लिए बहुत ही बुनियादी और सरल तरीका है।
PS: यह समाधान Xcode 9.X और Swift 4 में बनाया गया है
एक प्रोटोकॉल की घोषणा की और ViewControllerB में एक प्रतिनिधि संस्करण बनाया
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)
}
}
ViewControllerA प्रोटोकॉल की पुष्टि करता है और प्रतिनिधि विधि 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 के साथ एक साइट है