我有一个UIViewController有几个segues深度,当使用完成时,应该unwind
并将它们带回DashboardViewController。
我在信息中心中创建了unwindToDashboard
方法,并将一个按钮连接到Exit
中的FinishViewController
。因此,点击它将触发展开动作。
工作正常。
但我需要从FinishViewController传回数据到仪表板。
所以我为ProcessDataDelegate
创建了一个委托FinishViewController
,并使仪表板符合它。
但是,控制板中的委托方法是 NOT 调用。
谁能告诉我我做错了什么?
DashboardViewController.m
#import "FinishViewController.h"
@interface DashboardViewController () <ProcessDataDelegate>{
FinishViewController *fm;
}
@end
@implementation DashboardViewController
- (void)viewDidLoad {
[super viewDidLoad];
if(!fm){
fm = [[FinishViewController alloc] init];
}
fm.delegate = self;
}
- (IBAction)unwindToDashboard:(UIStoryboardSegue *)unwindSegue {
//empty
}
#pragma mark PROTOCOL METHODS
-(void) didFinishWithResults:(NSDictionary*) dictionary{
NSLog(@"Dashboard method called didFinishWithResults");
}
@end
FinishViewController.h
@class FinishViewController;
@protocol ProcessDataDelegate <NSObject>
@required
- (void) didFinishWithResults: (NSDictionary*)dictionary;
@end
@interface FinishViewController : UIViewController
@property (nonatomic, weak) id <ProcessDataDelegate> delegate;
@end
FinishViewController.m
@interface FinishViewController ()
@end
@implementation FinishViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSLog(@"fired via the button to the exit--- Segue: %@", [segue identifier]);
[delegate didFinishWithResults:nil ];
}
@end
答案 0 :(得分:1)
You need pass your delegate in The result looks like this:
Name Start_time End_time
1 John 5/6/15 6:30
2 John2 5/7/15 4:30 5/6/15 8:30
3 Ben 5/8/15 2:30 5/7/15 7:25
4 Ben2 5/9/15 3:10 5/8/15 4:10
I want it to look like this:
Name Start_time End_time
1 John 5/6/15 6:30 5/6/15 8:30
2 John2 5/7/15 4:30 5/7/15 7:25
3 Ben 5/8/15 2:30 5/8/15 4:10
4 Ben2 5/9/15 3:10 5/9/15 5:20
method of your function Canvas(width, height, camera) {
this.canvas = document.createElement('canvas')
this.canvas.width = width
this.canvas.height = height
this.context = this.canvas.getContext('2d')
this.camera = camera
this.image = undefined
document.body.appendChild(this.canvas)
}
Canvas.prototype.generateBackground = function(worldWidth, worldHeight) {
let cvs = document.createElement('canvas')
let ctx = cvs.getContext('2d')
cvs.width = worldWidth
cvs.height = worldHeight
let boxSize = 50
for(let i = 0; i <= worldWidth; i += boxSize) {
ctx.moveTo(i, 0)
ctx.lineTo(i, worldHeight)
ctx.stroke()
}
for(let j = 0; j <= worldHeight; j+= boxSize) {
ctx.moveTo(0, j)
ctx.lineTo(worldWidth, j)
ctx.stroke()
}
let dataUrl = ctx.canvas.toDataURL("image/png");
let img = new Image()
img.src = dataUrl
this.img = img
ctx = null
}
Canvas.prototype.drawBackground = function() {
let canvas = this.canvas
let context = this.context
let xPos = this.camera.xPos
let yPos = this.camera.yPos
let img = this.img
context.clearRect(0, 0, canvas.width, canvas.height)
context.drawImage(img, xPos, yPos, canvas.width, canvas.height, 0, 0, canvas.width, canvas.height)
}
let c = new Canvas(500, 500, {xPos: 0, yPos: 0})
c.generateBackground(10000, 10000)
setInterval(() => c.drawBackground(), 15)
, there get the #include <stdio.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
using thrust::host_vector;
using thrust::device_vector;
#define BLOCKSIZE 512
__global__ void child(int* a)
{
if (threadIdx.x == 0 && blockIdx.x == 0)
a[0]++;
}
__global__ void parent(int* a)
{
if (threadIdx.x == 0 && blockIdx.x == 0)
child<<<gridDim, blockDim>>>(a);
}
#define NBLOCKS 1024
#define NTHREADS 1024
#define BENCHCOUNT 1000
template<typename Lambda>
void runBench(Lambda arg, int* rp, const char* name)
{
// "preheat" the GPU
for (int i = 0; i < 100; i++)
child<<<dim3(NBLOCKS,1,1), dim3(NTHREADS,1,1)>>>(rp);
cudaEvent_t start, stop;
float rtime = 0.0f;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
for (int i = 0; i < BENCHCOUNT; i++)
arg();
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&rtime, start, stop);
printf("=== %s ===\n", name);
printf("time: %f ms\n", rtime/BENCHCOUNT); fflush(stdout);
cudaEventDestroy(start);
cudaEventDestroy(stop);
cudaDeviceSynchronize();
}
int main(int argc, char **argv)
{
host_vector<int> hv(1);
hv[0] = 0xAABBCCDD;
device_vector<int> dv(1);
dv = hv;
int* rp = thrust::raw_pointer_cast(&dv[0]);
auto benchFun = [&](void) {
child<<<dim3(NBLOCKS,1,1), dim3(NTHREADS,1,1)>>>(rp); };
runBench(benchFun, rp, "Single kernel launch");
auto benchFun2 = [&](void) {
for (int j = 0; j < 2; j++)
child<<<dim3(NBLOCKS,1,1), dim3(NTHREADS,1,1)>>>(rp);
};
runBench(benchFun2, rp, "2x sequential kernel launch");
auto benchFunDP = [&](void) {
parent<<<dim3(NBLOCKS,1,1), dim3(NTHREADS,1,1)>>>(rp); };
runBench(benchFunDP, rp, "Nested kernel launch");
}
and cast to prepareForSegue
if the identifier is equal to your expected segue identifier
Something like this
DashboardViewController