[Iphone] पिछला दृश्य नियंत्रक को वापस डेटा पास करें


Answers

प्रोटोकॉल / प्रतिनिधि की तुलना में एक छोटा और सरल तरीका एक बंद करना है:

मेरे मामले में एक स्ट्रिंग वापस भेजने के लिए ViewControllerA में:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let viewControllerB = segue.destination as? ViewControllerB {
        viewControllerB.callback = { message in
            //Do what you want in here!
        }
    }
}

ViewControllerB में:

var callback : ((String) -> Void)?

@IBAction func done(sender: AnyObject) {
    callback?("Hi")
    self.dismiss(animated: true, completion: nil)
}
Question

मैं पिछली बार देखने के लिए डेटा पास करने की कोशिश कर रहा हूँअनुवादक

क्या किसी को पता है कि ViewController B से ViewController A को वापस डेटा कैसे पास किया जाए? इसलिए मुझे एक स्ट्रिंग चाहिए जिसे 'बिडएडटीपऑफ़ डीयल वी वीकंट्रोलर से' बीआईडीडसीसीआरएट वीआईएकंट्रोलर 'में जाना चाहिए। एक उपयोगकर्ता दृश्य नियंत्रक बी को संपादित करता है और मैं चाहता हूं कि संपादित डेटा वापस ViewController A में, जहां मैं इसका उपयोग करता हूं।

मैं इस उत्तर के 'पास डेटा वापस' अनुभाग का उपयोग कर रहा हूं मेरा कितना अलग है: अंक 3 और 6 में बस का उल्लेख है जब विचार पॉप किए जाते हैं तो मैंने उस कोड को दृश्य में डाल दिया है। मुझे लगता है कि यह सही है? इसके अलावा प्वाइंट 6 पर मैंने नीब के साथ आरंभ नहीं किया क्योंकि यह पुराना है। मैं स्टोरीबोर्ड का उपयोग कर रहा हूं और मैंने उस आखिरी पंक्ति को नहीं जोड़ा था क्योंकि मुझे विश्वास नहीं होता कि मुझे उसे धक्का देना होगा। मेरे स्टोरीबोर्ड पर एक बटन दबाने से पहले मुझे आगे ले जाता है

मुझे लगता है कि समस्या BIDDCCreateViewController में उत्पन्न हो सकती है, मेरे पास विधि है लेकिन मैं इसे नहीं चला सकता एक विधि को चलाने के लिए इसे [स्व विधि] जाना चाहिए मैं ऐसा करने में असमर्थ हूँ ठीक है, मैं बस अनुमान लगा रहा हूं।

यह संकलन करता है और ठीक चल रहा है बस कुछ भी नहीं लॉग है, इसलिए मुझे नहीं पता कि यह काम करता है।

अद्यतनः मैं निष्पादित करने के लिए 'sendDataToA' विधि प्राप्त करने में असमर्थ हूं।

#import <UIKit/UIKit.h>
#import "BIDAddTypeOfDealViewController.h"

 @interface BIDDCCreateViewController : UIViewController
 @property (strong, nonatomic) NSString *placeId;
- (IBAction)gotoBViewController:(id)sender;
@end


#import "BIDDCCreateViewController.h"
#import "BIDAddTypeOfDealViewController.h"

@implementation BIDDCCreateViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId);
}

-(void)sendDataToA:(NSString *)myStringData
{

    NSLog(@"Inside sendDataToA");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Your string Data Showing" message:myStringData delegate:self cancelButtonTitle:@"Ok " otherButtonTitles:nil];
    [alert show];
}

- (IBAction)gotoBViewController:(id)sender {
    NSLog(@"pressed");
    BIDAddTypeOfDealViewController *bidAddType = [[BIDAddTypeOfDealViewController alloc]init];
    bidAddType.delegate = self;

}
@end


@protocol senddataProtocol <NSObject>
-(void)sendDataToA:(NSString *)myStringData;
@end

#import <UIKit/UIKit.h>
@interface BIDAddTypeOfDealViewController : UIViewController <UITextFieldDelegate>//Using this delegate for data a user inputs
@property(nonatomic,assign)id delegate;
//other textfield outlets not relevant
- (IBAction)chooseDiscountDeal:(id)sender;
@end

#import "BIDAddTypeOfDealViewController.h"

@interface BIDAddTypeOfDealViewController ()

@end

@implementation BIDAddTypeOfDealViewController
@synthesize delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)viewWillDisappear:(BOOL)animated
{
    [delegate sendDataToA:@"Apple"];
}
@end



संपादित करें: ऊपर @ एरहान के समाधान का उपयोग करें। यह नहीं। यह एक अच्छा समाधान नहीं है

ये सहायता करेगा। इसे अपने ViewControllerB में लिखें

    // Get array of current navigation stack
    NSArray *arrayViewControllers = [self.navigationController viewControllers];

    // Get previous viewController object from it
    YOUR_VIEW_CONTROLLER_NAME *objViewController = (YOUR_VIEW_CONTROLLER_NAME *)[arrayViewControllers objectAtIndex:arrayViewControllers.count-2];

    // For safety this check is needed. whether it the class that you want or not.
    if ([objViewController isKindOfClass:[YOUR_VIEW_CONTROLLER_NAME class]])
    {
        // Access properties of YOUR_VIEW_CONTROLLER_NAME here
        objViewController.yourProperty = YOUR_VALUE;
    }



कस्टम प्रतिनिधि आंकड़ों को स्थानांतरित करने का सबसे अच्छा विकल्प है, लेकिन आप इसे भी प्रयास कर सकते हैं।

आप जहां कहीं चाहें डेटा को स्थानांतरित करने के लिए NSUserDefaults का उपयोग कर सकते हैं

स्विफ्ट 3 कोड

UserDefaults.standard.set(<Value>, forKey: <Key>) 
// To set data

UserDefaults.standard.object(forKey: <Key>) 
// To get data

आप कदम डेटा के लिए NSNotification का उपयोग भी कर सकते हैं।

NotificationCenter.default.post(name: Notification.Name(rawValue: "refresh"), object: myDict) 

NotificationCenter.default.addObserver(self, selector: #selector(refreshList(_:)), name: NSNotification.Name(rawValue: "refresh"), object: nil)