在ObjectiveC上传递代表之间的信息

时间:2015-10-19 09:32:45

标签: ios objective-c delegates tableview

我需要在CameraSessionView之间传回一张NSMutableArray照片;如何在NSMutableArray上存储从相机拍摄的照片,以及如何将这些照片上传到DropBox的TableViewController。我使用了委托和协议,但我尝试过的所有方法都失败了。 任何人都可以帮助我。我觉得我做错了一些小事。 我给你看一些代码:

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。

onTapOKButton上的self.delegado总是为零。

看起来很简单,但我无法运行它。 如果有人能帮助我或推荐我任何教程,我感激不尽......

谢谢!

3 个答案:

答案 0 :(得分:3)

一旦viewDidLoad结束,您的CameraSessionView实例将从内存中释放。您需要将其存储在PhotosTableViewController中的属性中,以便保留它。

您的代表也应被定义为弱,例如

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

然后在您的PhotosTableViewController实现中,您需要实现-(void)uploadPhotosFromCamera:(NSMutableArray*)photos;方法。

此方法定义为@optional时,您应该在调用之前检查委托是否响应它。

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

如果未实施委托方法,这将阻止应用程序崩溃。

答案 1 :(得分: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

答案 2 :(得分:0)

如果必须将数据从B视图控制器传递到视图控制器

  1. 在B视图控制器中创建协议

    @protocol BViewControllerDelegate <NSObject>
    -(void)didclickonSubmit:(NSArray*)selected_array;
    @end
    
  2. 创建一个id,以便您可以将任何类指定为其委托类。

    @property (weak,nonatomic) id<BViewControllerDelegate> delegate;
    
  3. 在提交按钮或任何需要的地方,在B视图控制器中调用此方法。

    if (self.delegate && [self.delegate respondsToSelector:@selector(didclickonSubmit:)])
    {
    [self.delegate didclickonSubmit:myarray];
    }
    
  4. 在视图控制器A中创建B视图控制器的对象,并将A指定为B

    的委托
    BViewController *b = [[BViewController alloc]init];
    b.delegate=self;
    
  5. 在A中实现B所需的协议方法并访问数组

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

    现在你可以使用myarray,因为你喜欢它..

  6. 点击示例项目的链接 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;
    

    快乐编码.. :)