Passing back info between delegates on ObjectiveC

后端 未结 3 1583
执念已碎
执念已碎 2020-12-22 11:39

I need to pass back an NSMutableArray of photos between a CameraSessionView; how store the photos taken from camera on an NSMutableArray, and a TableViewController how uploa

相关标签:
3条回答
  • 2020-12-22 12:05

    This is working for me. So, you can implement this Directly. Hope, you will get success. Oh! first check without camera activity. Just pass simple array of string to test the delegate

    /............*****************

    CameraSessionView.h file

    /............*****************

    #import <UIKit/UIKit.h>
    
    @class CameraSessionView;
    
    @protocol CameraSessionViewDelegate <NSObject>
    
    @optional
    -(void)uploadPhotosFromCamera:(NSMutableArray*)photos;
    
    @end
    
    @interface CameraSessionView : UIViewController
    
    @property (nonatomic,weak) id< CameraSessionViewDelegate >delegado;
    
    @end
    

    /............*****************

    CameraSessionView.m file

    /............*****************

    #import "CameraSessionView.h"
    
    @interface CameraSessionView ()
    @property (nonatomic, strong) NSMutableArray* images;
    @end
    
    @implementation CameraSessionView
    
    
    - (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(onTapOkButton)
     forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"OK" forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
    [self.view addSubview:button];
    }
    
    - (void)onTapOkButton{
    
    NSLog(@"Save photos");
    _images = [[NSMutableArray alloc]init];
    [_images addObject:@"_images1"];
    [_images addObject:@"_images2"];
    
    //NSLog(@"from del:%@",_images);
    
    if([self.delegado respondsToSelector:@selector(uploadPhotosFromCamera:)])
        [self.delegado uploadPhotosFromCamera:_images];
    
    [self onTapDismissButton];
    }
    -(void)onTapDismissButton{
    [self.view removeFromSuperview];
    }
    
    @end
    

    /............*****************

    DetailViewController.m file

    /.........********

    #import "DetailViewController.h"
    #import "CameraSessionView.h"
    
    
    @interface DetailViewController ()<CameraSessionViewDelegate>
    
    @end
    
    
    @implementation DetailViewController
    
    - (void)viewDidLoad {
    [super viewDidLoad];
    CameraSessionView *Camara= [[CameraSessionView alloc]initWithNibName:@"CameraSessionView" bundle:nil];
    [Camara setDelegado:self];
    [self.navigationController pushViewController:Camara animated:YES];
    }
    
    
    -(void)uploadPhotosFromCamera:(NSMutableArray*)photos{
    NSLog(@"success:%@",photos);
    }
    @end
    
    0 讨论(0)
  • 2020-12-22 12:13

    If you have to pass data from B View Controller To A view Controller

    1. Create protocol in B View Controller as

      @protocol BViewControllerDelegate <NSObject>
      -(void)didclickonSubmit:(NSArray*)selected_array;
      @end
      
    2. Create an id, so that you can assign any class as its delegate class.

      @property (weak,nonatomic) id<BViewControllerDelegate> delegate;
      
    3. Call this method in B View Controller on submit button or wherever required.

      if (self.delegate && [self.delegate respondsToSelector:@selector(didclickonSubmit:)])
      {
      [self.delegate didclickonSubmit:myarray];
      }
      
    4. Create an object of B View Controller in View Controller A and assign A as delegate of B

      BViewController *b = [[BViewController alloc]init];
      b.delegate=self;
      
    5. Implement required protocol methods of B in A and access the array

        -(void)didclickonSubmit:(NSArray*)array
        {              
           NSArray *myarray =[[NSMutableArray alloc]initWithArray:array];
        }
      

      now you can use myarray,as u like it..

    hit link for sample project https://www.dropbox.com/s/002om8efpy6fout/passDataToPreviousContoller.zip Hope it helps..

    ****EDITED**** u can for sure assign tableViewController as delegate of UIView class.

    @protocol BView <NSObject>
    -(void) didclickonSubmit:(NSArray*) selected_array;
    @end
    @interface BView : UIView
    @property (weak,nonatomic) id<BView> delegate;
    @end  
    
      in A i.e. your tableViewController create an object of B and assign your tableview controller as delegate of B .
    
    
    BView *b=[[BView alloc]init];                                                                                            
    b.delegate=self;
    

    Happy Coding..:)

    0 讨论(0)
  • 2020-12-22 12:22

    Your CameraSessionView instance will be released from memory as soon as viewDidLoad ends. You need to store it in a property in PhotosTableViewController so that it is retained.

    Your delegate should also be defined as weak, e.g.

    @property (nonatomic,weak) id< CameraSessionViewDelegate >delegado;
    

    Then in your implementation of PhotosTableViewController, you'll need to implement the -(void)uploadPhotosFromCamera:(NSMutableArray*)photos; method.

    Also as this method is defined as @optional, you should check if the delegate responds to it before calling it.

       if([self.delegado respondsToSelector:@selector(uploadPhotosFromCamera:]){
            [self.delegado uploadPhotosFromCamera:_images];
       }
    

    This will prevent the app from crashing if the delegate method isn't implemented.

    0 讨论(0)
提交回复
热议问题