当另一个类完成处理所需数据时如何中断 Viewcontroller
Posted
技术标签:
【中文标题】当另一个类完成处理所需数据时如何中断 Viewcontroller【英文标题】:How to interrupt a Viewcontroller when another class is finished processing required data 【发布时间】:2017-05-25 19:48:24 【问题描述】:我有两个类,一个视图控制器和另一个执行异步进程的 NSObject 类,一旦完成,我想中断视图控制器,类似于按钮作为 IBAction 所做的操作,以更新 UI。我想保持这个功能模块化,以便在以后的阶段更好地使用。有没有办法在 Objective-c 上做到这一点?
CircleDetectionViewController.h:
#import <UIKit/UIKit.h>
#import "CameraController.h"
@interface CircleDetectionViewController : UIViewController <MyDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *screenPreview;
@end
CircleViewController.mm:
@interface CircleDetectionViewController () <CvVideoCameraDelegate>
@end
@implementation CircleDetectionViewController
CvVideoCamera *camera;
//code
@end
CameraController.h:
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import "CircleDetectionViewController.h"
@protocol MyDelegate <NSObject>
-(void) updateUI;
@end
@interface CameraController : NSObject <MyDelegate>
@property (nonatomic, strong) AVCaptureDevice *inputDevice;
@property (nonatomic, strong) AVCaptureSession *session;
@property (nonatomic, strong) AVCaptureStillImageOutput *photoOutput;
@property (nonatomic, weak) id <MyDelegate> delegate;
@end
CameraController.m:
#import "CameraController.h"
#import "FlashHelper.h"
#import "ImageProcessor.h"
@implementation CameraController
@synthesize delegate;
FlashHelper *Flash;
ImageProcessor *IMGProcessor;
int shootCounter;
int NUMSHOTS = 2;
-(id)init
//code
由于某种原因,代码显示“没有名为 MyDelegate 的类型或协议” 任何帮助将不胜感激!
【问题讨论】:
使用委托或回调/完成块。这应该是您在理解它们后可以轻松使用谷歌搜索和使用的术语。 代表模式的最佳时机! developer.apple.com/library/content/documentation/General/… 我的视图控制器已经有一个用于 openCV 的委托,我还能使用我自己的自定义委托吗? 【参考方案1】:在 NSObject 类中创建一个委托:
@protocol MyDelegate <NSObject>
-(void) updateUI;
@end
并声明委托的属性
@property (nonatomic, weak) id <MyDelegate> delegate;
在 viewcontroller 类中调用委托类
NSObject 类obj.delegate = self;
并实现委托方法。
始终从主线程更新您的 UI。
要获取主线程,请使用:
dispatch_async(dispatch_get_main_queue(), ^
// call your delegate method or update UI here
);
有关委托方法的详细信息,请查看this。
【讨论】:
我的委托问题是我的视图控制器已经有一个委托在使用 openCV 相机一个,有没有办法使用两个委托? 您可以在一个视图控制器中调用多个委托,例如 UIViewController以上是关于当另一个类完成处理所需数据时如何中断 Viewcontroller的主要内容,如果未能解决你的问题,请参考以下文章