Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新安装应用程序后,UIImage始终返回null_C#_Xamarin.ios - Fatal编程技术网

C# 重新安装应用程序后,UIImage始终返回null

C# 重新安装应用程序后,UIImage始终返回null,c#,xamarin.ios,C#,Xamarin.ios,我正在iphone6s上测试我的应用程序。这里已经有人问过这个问题,但建议的解决方案似乎对我不起作用。我正在与Monotouch(c#)合作 我这样保存图像: var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal); string jpgFilename = System.IO.Path.Combine(documentsDirectory,"photo.jpg"); NSDat

我正在iphone6s上测试我的应用程序。这里已经有人问过这个问题,但建议的解决方案似乎对我不起作用。我正在与Monotouch(c#)合作

我这样保存图像:

var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string jpgFilename = System.IO.Path.Combine(documentsDirectory,"photo.jpg");
NSData imgData = image.AsJPEG();
NSError err = null;
if (imgData.Save(jpgFilename, false, out err))
{
    userProfile.ImageFilePath = jpgFilename;

    Console.WriteLine("saved as " + jpgFilename);
}
else {
    Console.WriteLine("NOT saved as" + jpgFilename + " because" + err.LocalizedDescription);
}
var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string localFile = System.IO.Path.Combine(documentsDirectory, "photo.jpg");

UIImage savedImage = UIImage.FromFile(localFile);

if (savedImage != null)
{

    imgPhoto.Image = savedImage;
}
然后,在另一个
UIViewController
视图中将出现
,我尝试按如下方式加载它:

var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string jpgFilename = System.IO.Path.Combine(documentsDirectory,"photo.jpg");
NSData imgData = image.AsJPEG();
NSError err = null;
if (imgData.Save(jpgFilename, false, out err))
{
    userProfile.ImageFilePath = jpgFilename;

    Console.WriteLine("saved as " + jpgFilename);
}
else {
    Console.WriteLine("NOT saved as" + jpgFilename + " because" + err.LocalizedDescription);
}
var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string localFile = System.IO.Path.Combine(documentsDirectory, "photo.jpg");

UIImage savedImage = UIImage.FromFile(localFile);

if (savedImage != null)
{

    imgPhoto.Image = savedImage;
}
不幸的是,在重新安装应用程序后,我的
savedImage
始终为空。在调试模式下进行测试

有人知道Xamarin.iOS的解决方案吗

编辑

我已经了解到,我不应该将绝对路径保存到我的应用程序数据目录。我应该只保存相对路径(相对于应用程序的目录)。问题是应用程序的路径(GUID)每次都会更改。因此图像为空,因为它已被移动

因此,每次我重新安装应用程序时,路径中的GUID都不同

/var/mobile/Containers/Data/Application/637F7758-5102-4328-9969-A4ED3826139E/Documents/photo.jpg.

如何保存正确的相对路径?

您所问的是不可能的。在调试会话之间卸载应用程序时,将按所述删除

另一方面,如果在调试会话之间没有卸载应用程序,则存储在
Environment.SpecialFolder.Personal
中的数据仍然可用

请注意,正如您自己所观察到的,应用程序沙盒的GUID在调试会话之间会发生更改。内容只是简单地复制到新目录中。这意味着您不会在会话之间丢失数据

使用iCloud文档存储 但是,你应该考虑的是使用。这将允许您将数据保存到iCloud,卸载应用程序,并在再次安装应用程序后加载给定数据


尽管如此,如果您决定使用这种方法,仍然存在一些如上所述的要求。

您所要求的是不可能的。在调试会话之间卸载应用程序时,将按所述删除

另一方面,如果在调试会话之间没有卸载应用程序,则存储在
Environment.SpecialFolder.Personal
中的数据仍然可用

请注意,正如您自己所观察到的,应用程序沙盒的GUID在调试会话之间会发生更改。内容只是简单地复制到新目录中。这意味着您不会在会话之间丢失数据

使用iCloud文档存储 但是,你应该考虑的是使用。这将允许您将数据保存到iCloud,卸载应用程序,并在再次安装应用程序后加载给定数据


尽管如此,如果您决定使用这种方法,仍然存在一些要求。

通过“重新安装”,您的意思是在开始新的调试会话之前您自己从模拟器中删除应用程序吗?是的。我从设备中删除应用程序并启动新的调试会话。所谓“重新安装”,是指您在启动新的调试会话之前自己从模拟器中删除应用程序吗?是的。我将从设备中删除应用程序并启动新的调试会话。谢谢!我没有意识到这个文件夹中的文档以及所有其他应用程序的数据都被删除了。这回答了我的问题。我在同一个会话中再次测试了该功能,它确实有效。谢谢!我没有意识到这个文件夹中的文档以及所有其他应用程序的数据都被删除了。这回答了我的问题。在同一个会话中,我再次测试了该函数,它确实有效。