দু'জন ভিউ কন্ট্রোলারের মধ্যে যোগাযোগের জন্য আমি কীভাবে একটি সহজ প্রতিনিধি সেট আপ করব?


136

আমার দুটি রয়েছে UITableViewControllersএবং চাইল্ড ভিউ কন্ট্রোলার থেকে একটি প্রতিনিধি ব্যবহার করে পিতামাতার কাছে মানটি পাঠাতে হবে। আমি জানি প্রতিনিধিরা কী এবং কেবল উদাহরণ অনুসরণ করার জন্য একটি সাধারণ দেখতে চেয়েছিলেন।

ধন্যবাদ


1
আপনি যদি "ইউটিলিটি" এক্সকোড টেমপ্লেটটি ব্যবহার করে থাকেন তবে ইতিমধ্যে ইতিমধ্যে প্রয়োগ করা একটি প্রতিনিধি প্যাটার্ন রয়েছে। এর চেয়ে বেশি সাহায্যের দরকার কি?
phi

এখানে একটি খুব সহজ টিউটোরিয়াল। টিউটোরিয়ালস্পয়েন্ট
মুহাম্মদ_আওব

উত্তর:


304

সাধারণ উদাহরণ ...

ধরা যাক চাইল্ড ভিউ কন্ট্রোলারের একটি রয়েছে 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

আশাকরি এটা সাহায্য করবে!


1
কীভাবে পিতামাতারা সন্তানের প্রতিনিধি হিসাবে নিবন্ধন করেন?
ম্যাডব্রেকস 16'13

2
কল করে detailViewController.delegate = self;(এটি -tableView:didSelectRowAtIndexPath:উপরের কোড স্নিপেটে রয়েছে
সাইমন হুইটেকার

ধন্যবাদ। চাইল্ডভিউকন্ট্রোলার যদি ইউআইটিএবলভিউতে প্রতিনিধি হয় তবে ইউআইটিএবলভিউ পদ্ধতিগুলি কোথায় হওয়া উচিত? সন্তানের মধ্যে নাকি বাবা-মা?
দেজেল

দুর্দান্ত উদাহরণ / ব্যাখ্যা! দুর্ভাগ্যক্রমে, আমি সংকলনের চেষ্টা করার সময় আমি "'মাইপ্রোটোকল' এর জন্য প্রোটোকল ঘোষণার সন্ধান করতে পারছি না" পেয়েছি। এটি আপনি যেমন বর্ণনা করেছেন তেমনই: স্প্যানড ভিউ কন্ট্রোলারটির .h ফাইলে প্রকোটল সংজ্ঞা রয়েছে এবং এর .m ফাইলে প্রোটোকল পদ্ধতিটি আহ্বান করা হয়েছে। হোস্টিং ভিউকন্ট্রোলারের <। মাইপ্রোটোকল> এর .h @ অন্তর্ভুক্ত ঘোষণা - যা এখানে ত্রুটি ঘটে। আপনার উত্তরটি একই বলে মনে হচ্ছে, যদিও ... কোনও ধারণা?
ড্যানি

ধন্যবাদ. আমি কমপক্ষে এক ডজন সংস্থান দেখেছি এবং এটিই আমি অনুসরণ করতে সক্ষম হয়েছি। আমি মনে করি সংখ্যাযুক্ত কোড মন্তব্যগুলি এর ক্রমটি ব্যাখ্যা করতে সহায়তা করে।
জেসি

32

এই নীচের কোডটি কেবল প্রতিনিধি ধারণার খুব প্রাথমিক ব্যবহার দেখায় .. আপনি আপনার প্রয়োজন অনুসারে ভেরিয়েবল এবং ক্লাসের নাম দেন।

প্রথমে আপনাকে একটি প্রোটোকল ঘোষণা করতে হবে:

আসুন একে MyFirstControllerDelegate.h বলি

@protocol MyFirstControllerDelegate
- (void) FunctionOne: (MyDataOne*) dataOne;
- (void) FunctionTwo: (MyDatatwo*) dataTwo;
@end

MyFirstControllerDelegate.h ফাইলটি আমদানি করুন এবং প্রোটোকল মাই ফার্স্টকন্ট্রোলারডেলিগেটের সাহায্যে আপনার প্রথম নিয়ন্ত্রণকারীকে নিশ্চিত করুন

#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

সেকেন্ডকন্ট্রোলারের বাস্তবায়ন ফাইলে ।

@implementation SecondController

@synthesize delegate;
//Call below two function on self.
-(void) SendOneDataToFirstController
{
   [delegate FunctionOne:myDataOne];
}
-(void) SendSecondDataToFirstController
{
   [delegate FunctionTwo:myDataSecond];
}

@end

প্রতিনিধি সম্পর্কিত উইকি নিবন্ধটি এখানে is


যদিও এটি কোনও ওয়ার্কিং ডেলিগেট প্রোটোকল সেটআপ করবেন covers আমি মনে করি এটি কয়েকটি মূল বিষয় বাদ দিচ্ছে। প্রথমত, প্রতিনিধিটির কাছে পদ্ধতিগুলি কল করার সময় আপনাকে প্রথমে পরীক্ষা করা উচিত যে প্রতিনিধি সেই নির্বাচককে প্রতিক্রিয়া জানায়। এটি না করলে আপনার অ্যাপ্লিকেশন ক্রাশ হবে। দ্বিতীয়ত আপনাকে "@ প্রোটোকল মাইফার্সট্রোলারডেলিগেট "টি @ প্রোটোকল মাইফার্সট্রোলারডিলিগেট <এনএসব্যাটেক্ট
সিডব্লিউ 20007007

6

প্রতিনিধি ব্যবহার করে ভিসি 2 থেকে ভিসি 1 তে ডেটা প্রেরণের জন্য নিম্নলিখিত সমাধানটি খুব বেসিক এবং সাধারণ পদ্ধতির।

পিএস: এই দ্রবণটি এক্সকোড 9. এক্স এবং সুইফ্ট 4-এ তৈরি করা হয়েছে

একটি প্রোটোকল ঘোষণা করে এবং একটি নির্মিত প্রতিনিধি মধ্যে Var 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
            }
        }
    }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.