2015-10-19 2 views
0

Мне нужно передать NSMutableArray фотографий между CameraSessionView; как сохранить фотографии, снятые с камеры на NSMutableArray, и TableViewController, как загрузить эти фотографии в DropBox. Я использую делегаты и протоколы, но все способы, которые я пробовал, терпят неудачу. Любой может мне помочь. Я думаю, что я делаю что-то неправильно. я покажу вам код:Передача информации между делегатами по ObjectiveC

CameraSessionView.h

@class CameraSessionView; 
@protocol CameraSessionViewDelegate <NSObject> 
@optional 
-(void)uploadPhotosFromCamera:(NSMutableArray*)photos; 
@end 

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

CameraSessionView.m

@property (nonatomic, strong) NSMutableArray* images; 

- (void)onTapOkButton{ 

    NSLog(@"Save photos"); 

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

    [self onTapDismissButton]; 
} 

PhotosTableViewController.h

@interface PhotosTableViewController : UITableViewController <CameraSessionViewDelegate> 

PhotosTableViewController.m

@property (nonatomic, strong) CameraSessionView *camera; 
- (void)viewDidLoad 
{ 
_camera = [CameraSessionView new]; 
[_camera setDelegado:self]; 
} 
-(void)uploadPhotosFromCamera:(NSMutableArray*)photos 
{ 
    NSLog(@"UPFC"); 
    for(int x=0; x < [photos count];x++) 
    { 
     NSLog(@"UPFC..."); 

     UIImage *foto = [photos objectAtIndex:x]; 

     if (foto.size.height > 1000 || foto.size.width > 1000) 
      foto = [self imageWithImage:foto scaledToScale:0.15f]; 

     DBMetadata* datos = [TablaSubidas addFile:pathElemento]; 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     NSData *data = UIImageJPEGRepresentation(foto, 1.0); 
     [fileManager createFileAtPath:[self photoPath:datos] contents:data attributes:nil]; 
     [elementosTabla insertObject:datos atIndex:0]; 
    } 

    [self sincFotos]; 
    [self.tableView reloadData]; 
} 

Только хочет, чтобы при нажатии кнопки OK фотографии отправляются обратно в PhotosTableViewController, где он будет загружен в Dropbox.

self.delegado on onTapOKButton всегда nil.

Выглядит легко, но я не могу его запустить. Я так благодарен, если кто-нибудь может мне помочь или порекомендовать мне какой-нибудь учебник ...

Спасибо!

+0

Вы не ввели в PhotosTableViewContoller - (Недействительными) uploadPhotosFromCamera: (NSMutableArray *) фотографии; Я думаю, что это в значительной степени то, чего не хватает. – dirtydanee

ответ

3

Ваш экземпляр CameraSessionView будет выпущен из памяти, как только viewDidLoad закончится. Вам необходимо сохранить его в свойстве в PhotosTableViewController, чтобы он остался.

Ваш делегат также должен быть определен как слабый, например.

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

Затем в реализации PhotosTableViewController, вам необходимо реализовать метод -(void)uploadPhotosFromCamera:(NSMutableArray*)photos;.

Также как этот метод определяется как @optional, вы должны проверить, отвечает ли его делегат перед его вызовом.

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

Это предотвратит сбой приложения, если метод делегирования не реализован.

+0

-uploadPhotosFromCamera метод уже реализован, я забыл вставить его. Этот IF (... отвечаетSoSelector ...) никогда не выполняется ... self.delegado is nil – KurroCantos

+0

На какой стадии вы добавляете CameraSessionView на экран? – Tim

+0

У меня есть табличное представление, и когда я нажимаю на первую ячейку, я не могу выбрать способ добавления фотографий в таблицу, из галереи или из камеры (CameraSessionView), это может помочь вам https://www.dropbox.com /s/yp7lblacj2ujohw/2015-10-19%2013.30.06.png?dl=0 – KurroCantos

0

Это работает для меня. Таким образом, вы можете реализовать это прямо. Надеюсь, вы добьетесь успеха. Ой! первая проверка без активности камеры. Просто передайте простой массив из строки для проверки делегата

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

CameraSessionView.h файл

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

#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 файл

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

#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 файл

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

#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

Я сделал изменения, которые Джефф сказал мне и выглядел лучше ... но все же, не вызвав метод делегата – KurroCantos

+0

, вы реализовали «- (void) uploadPhotosFromCamera: (NSMutableArray *) фотографии { NSLog (@" success:% @ ", фотографии) } " – Jamil

+0

метод в файле PhotosTableViewController.m? – Jamil

0

Если вы должны передать данные из B View Controller на вид контроллера

  1. Создание протокола в B View Controller в

    @protocol BViewControllerDelegate <NSObject> 
    -(void)didclickonSubmit:(NSArray*)selected_array; 
    @end 
    
  2. Создать идентификатор, так что вы можете назначить любой класс как его класс делегата.

    @property (weak,nonatomic) id<BViewControllerDelegate> delegate; 
    
  3. Вызовите этот метод в B View Controller на кнопке отправки или там, где это необходимо.

    if (self.delegate && [self.delegate respondsToSelector:@selector(didclickonSubmit:)]) 
    { 
    [self.delegate didclickonSubmit:myarray]; 
    } 
    
  4. Создать объект B View Controller в View Controller A и назначить в качестве делегата от B

    BViewController *b = [[BViewController alloc]init]; 
    b.delegate=self; 
    
  5. Реализовать необходимые методы протокольных B в A и получить доступ к массиву

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

    сейчас вы можете использовать myarray, так как u нравится.

хит ссылку для образца проекта https://www.dropbox.com/s/002om8efpy6fout/passDataToPreviousContoller.zip Надеюсь, что это помогает ..

**** EDITED **** и может точно назначить tableViewController в качестве делегата от класса UIView.

@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; 

Днем Coding .. :)

+0

Я думаю, что есть проблема ... в моем proyect ... ViewControllerA является TableViewController и ViewControllerB является UIView ... будет ли проблема? – KurroCantos

+0

Это не должно быть проблемой. u может точно назначить tableViewController как делегат класса UIView. Я обновил свои анны. – luckyShubhra

+0

Ваш код для меня, попробуй с отладчиком. Поместите отладчик туда, где вы реализовали метод делегирования B в tableViewController. Отходит ли отладчик после нажатия кнопки отправки. ??? Если это так, проблема должна быть на пути, где вы сохранили изображения. – luckyShubhra

Смежные вопросы