我需要在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总是为零。
看起来很简单,但我无法运行它。 如果有人能帮助我或推荐我任何教程,我感激不尽......
谢谢!
答案 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视图控制器传递到视图控制器
在B视图控制器中创建协议
@protocol BViewControllerDelegate <NSObject>
-(void)didclickonSubmit:(NSArray*)selected_array;
@end
创建一个id,以便您可以将任何类指定为其委托类。
@property (weak,nonatomic) id<BViewControllerDelegate> delegate;
在提交按钮或任何需要的地方,在B视图控制器中调用此方法。
if (self.delegate && [self.delegate respondsToSelector:@selector(didclickonSubmit:)])
{
[self.delegate didclickonSubmit:myarray];
}
在视图控制器A中创建B视图控制器的对象,并将A指定为B
的委托BViewController *b = [[BViewController alloc]init];
b.delegate=self;
在A中实现B所需的协议方法并访问数组
-(void)didclickonSubmit:(NSArray*)array
{
NSArray *myarray =[[NSMutableArray alloc]initWithArray:array];
}
现在你可以使用myarray,因为你喜欢它..
点击示例项目的链接 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;
快乐编码.. :)