创建 class 的实例后回调函数结束 (c#)

Callback function end after creating instance of class (c#)

我写了一些代码在 iOS 应用程序中绘制一些东西,如果服务器向它发送一些新坐标。

我有一个绘制坐标的回调函数。但是当我在这个函数中创建一个 class 的新实例时,回调退出没有任何错误...

其他人以前遇到过这个问题吗?

如果有用的话,这是我的代码

    CGPath pathtotal;
    List<CGPath> path;

    CGPoint initialPoint;
    CGPoint latestPoint;

    DrawDrawerDraw drawDrawerDraw;

    public DrawGuessView(IntPtr handle) : base(handle)
    {
        BackgroundColor = UIColor.White;
        pathtotal = new CGPath();

        SocketEventHandler.Add("draw:drawer:draw", onDrawDrawerDraw);
    }

    public void onDrawDrawerDraw(dynamic obj)
    {
        drawDrawerDraw = (DrawDrawerDraw)obj;

        for (int i = 0; i <= drawDrawerDraw.coords.Count; i++)
        {
            if (initialPoint.X != (nfloat)drawDrawerDraw.coords[i].x0 && initialPoint.Y != (nfloat)drawDrawerDraw.coords[i].y0)
            {
                path[i] = new CGPath();
            }

            initialPoint.X = (nfloat)drawDrawerDraw.coords[i].x0;
            initialPoint.Y = (nfloat)drawDrawerDraw.coords[i].y0;

            latestPoint.X = (nfloat)drawDrawerDraw.coords[i].x1;
            latestPoint.Y = (nfloat)drawDrawerDraw.coords[i].y1;

            //add lines to the touch points
            if (path[i].IsEmpty)
            {
                path[i].AddLines(new CGPoint[] { initialPoint, latestPoint });
            }
            else
            {
                path[i].AddLineToPoint(latestPoint);
            }
        }

        SetNeedsDisplay();
    }

    public override void Draw(CGRect rect)
    {
        base.Draw(rect);

        try
        {
            foreach (var item in path)
            {
                if (!initialPoint.IsEmpty)
                {
                    //get graphics context
                    using (CGContext g = UIGraphics.GetCurrentContext())
                    {
                        //set up drawing attributes
                        g.SetLineWidth(2);
                        UIColor.Black.SetStroke();

                        //add geometry to graphics context and draw it
                        pathtotal.AddPath(item);

                        g.AddPath(pathtotal);
                        g.DrawPath(CGPathDrawingMode.Stroke);
                    }
                }
            }
        }
        catch (Exception e) { }
    }
}

有两点需要修改

  1. DrawGuessView方法中初始化path

    public DrawGuessView(IntPtr handle) : base(handle)
    {
        BackgroundColor = UIColor.White;
        pathtotal = new CGPath();
        List<CGPath> path = new List<CGPath>();
        SocketEventHandler.Add("draw:drawer:draw", onDrawDrawerDraw);
    } 
    
  2. path[i] = new CGPath()会导致ArgumentOutOfRangeException,我们不能通过这种方式给List中的item赋值

    修改循环

    CGPath pathItem = null;
    for (int i = 0; i <= drawDrawerDraw.coords.Count; i++)
    {
         if (initialPoint.X != (nfloat)drawDrawerDraw.coords[i].x0 && initialPoint.Y != (nfloat)drawDrawerDraw.coords[i].y0)
        {
             pathItem = new CGPath();
        }
    
        initialPoint.X = (nfloat)drawDrawerDraw.coords[i].x0;
        initialPoint.Y = (nfloat)drawDrawerDraw.coords[i].y0;
    
        latestPoint.X = (nfloat)drawDrawerDraw.coords[i].x1;
        latestPoint.Y = (nfloat)drawDrawerDraw.coords[i].y1;
    
        //add lines to the touch points
        if (pathItem.IsEmpty)
        {
            pathItem.AddLines(new CGPoint[] { initialPoint, latestPoint });
        }
        else
        {
            pathItem.AddLineToPoint(latestPoint);
        }
        path.Add(pathItem);
    }