[iphone] डेटा को पिछले व्यू कंट्रोलर पर वापस पास करें



2 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 ए में डेटा को वापस कैसे पास किया जाए? इसलिए मैं एक स्ट्रिंग को BIDAddTypeOfDealViewController से 'BIDDCCreateViewController' से जाना चाहता हूं। कोई उपयोगकर्ता व्यू कंट्रोलर बी संपादित करता है और मैं उस संपादित डेटा को ViewController ए में वापस चाहता हूं जहां मैं इसका उपयोग करता हूं।

मैं इस उत्तर के 'गुजरने वाले डेटा बैक' खंड का उपयोग कर रहा हूं। मेरा कैसे भिन्न होता है: प्वाइंट 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



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

आप जहां चाहें डेटा को स्थानांतरित करने के लिए 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)



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

ये सहायता करेगा। इसे अपने 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;
    }





Related