不能在具有 DependencyService 的平台特定项目中使用多个委托?
Can't use more than one delegate in platform specific project with DependencyService?
我在 Xamarin.Forms 中有一个 IService
,看起来像这样:
namespace MyProject.Main
{
public delegate void XChanged();
public delegate void YChanged();
public delegate void ZChanged();
public interface IOrientationSensor
{
double X { get; set; }
double Y { get; set; }
double Z { get; set; }
event XChanged OnXChanged;
event YChanged OnYChanged;
event ZChanged OnZChanged;
void Start();
void Stop();
}
}
我首先尝试将我的委托放入接口中 - 但 Visual Studio 抱怨它 - 所以我读到它们可以放入命名空间中。
现在在我的 Service
、iOS 实现中我可以触发 OnChangedX
:
[assembly: Dependency(typeof(OrientationSensor)) ]
namespace MyProject.iOS
{
public class OrientationSensor : IOrientationSensor
{
CMMotionManager motionManager = new CMMotionManager();
NSOperationQueue queue = new NSOperationQueue();
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public event XChanged OnXChanged;
public event YChanged OnYChanged;
public event ZChanged OnZChanged;
public void Start()
{
motionManager.StartDeviceMotionUpdates(queue, DataUpdated);
}
public void Stop()
{
motionManager.StopDeviceMotionUpdates();
}
void DataUpdated(CMDeviceMotion data, NSError error)
{
if (data == null)
return;
// OnChangedX() works
// OnChangedY() crashes
// OnChangedZ() crashes
}
}
}
触发 Y 和 Z 崩溃并显示消息:
Object reference not set to an instance of an object
... 发射 X 时有效。
有人可以帮忙解释一下为什么我似乎只能使用 1 个代表吗?
我刚刚意识到我已将事件处理程序分配给 OnXChanged
,但没有分配给 OnYChanged
和 OnZChanged
。分配事件处理程序显然会给出事件值:
public static void UseSensors()
{
var orientationSensor = DependencyService.Get<IOrientationSensor>();
orientationSensor.OnXChanged += () =>
{
};
/* did not realize these where needed for OnChangedY and OnChangedZ to stop being null
orientationSensor.OnYChanged += () =>
{
};
orientationSensor.OnZChanged += () =>
{
};
*/
orientationSensor.Start();
}
我在 Xamarin.Forms 中有一个 IService
,看起来像这样:
namespace MyProject.Main
{
public delegate void XChanged();
public delegate void YChanged();
public delegate void ZChanged();
public interface IOrientationSensor
{
double X { get; set; }
double Y { get; set; }
double Z { get; set; }
event XChanged OnXChanged;
event YChanged OnYChanged;
event ZChanged OnZChanged;
void Start();
void Stop();
}
}
我首先尝试将我的委托放入接口中 - 但 Visual Studio 抱怨它 - 所以我读到它们可以放入命名空间中。
现在在我的 Service
、iOS 实现中我可以触发 OnChangedX
:
[assembly: Dependency(typeof(OrientationSensor)) ]
namespace MyProject.iOS
{
public class OrientationSensor : IOrientationSensor
{
CMMotionManager motionManager = new CMMotionManager();
NSOperationQueue queue = new NSOperationQueue();
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public event XChanged OnXChanged;
public event YChanged OnYChanged;
public event ZChanged OnZChanged;
public void Start()
{
motionManager.StartDeviceMotionUpdates(queue, DataUpdated);
}
public void Stop()
{
motionManager.StopDeviceMotionUpdates();
}
void DataUpdated(CMDeviceMotion data, NSError error)
{
if (data == null)
return;
// OnChangedX() works
// OnChangedY() crashes
// OnChangedZ() crashes
}
}
}
触发 Y 和 Z 崩溃并显示消息:
Object reference not set to an instance of an object
... 发射 X 时有效。
有人可以帮忙解释一下为什么我似乎只能使用 1 个代表吗?
我刚刚意识到我已将事件处理程序分配给 OnXChanged
,但没有分配给 OnYChanged
和 OnZChanged
。分配事件处理程序显然会给出事件值:
public static void UseSensors()
{
var orientationSensor = DependencyService.Get<IOrientationSensor>();
orientationSensor.OnXChanged += () =>
{
};
/* did not realize these where needed for OnChangedY and OnChangedZ to stop being null
orientationSensor.OnYChanged += () =>
{
};
orientationSensor.OnZChanged += () =>
{
};
*/
orientationSensor.Start();
}