我在简单的MonoTouch iPad应用程序中使用以下代码:
if (NSUserDefaults.StandardUserDefaults.StringForKey("spid") == null)
{
NSUserDefaults.StandardUserDefaults.SetString ("spid", "myName");
NSUserDefaults.StandardUserDefaults.SetString ("spdomain", "myDomain");
NSUserDefaults.StandardUserDefaults.SetString ("sppwd", "myPassword");
NSUserDefaults.StandardUserDefaults.Synchronize();
}
WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential(NSUserDefaults.StandardUserDefaults.StringForKey("spid"),
NSUserDefaults.StandardUserDefaults.StringForKey("sppwd"),
NSUserDefaults.StandardUserDefaults.StringForKey("spdomain"));
意图(现在直到我建立了正确的视图)是提供默认凭据,这些凭证将存储在plist文件中(稍后它将被移动到KeyChain中以获得更好的安全性)。但是,对StringForKey(“spid”)等的调用返回null而不是“myName”。
为什么在调用Synchronize()后我的默认值不会保留?即使在每个SetString()之后添加Synchronize()调用也无法解决问题。
答案 0 :(得分:8)
SetString
的参数遵循Apple API(以及惯例,对于.NET开发人员来说相当混乱,包括我),第一个参数包含值,第二个参数作为名称。
所以你需要写:
NSUserDefaults.StandardUserDefaults.SetString ("myName", "spid");
NSUserDefaults.StandardUserDefaults.SetString ("myDomain", "spdomain");
NSUserDefaults.StandardUserDefaults.SetString ("myPassword", "sppwd");
NSUserDefaults.StandardUserDefaults.Synchronize();
以获得正确的行为。