- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我被动地使用这个网站已经有一段时间了,并且已经阅读了常见问题解答,所以我希望能够将这些内容保持在最低限度。
我对 Objective-C 中的 Settings.bundle 文件有疑问。我一直在使用以下指南来实现其中之一:
我同时使用 Xcode 4.1 和最新的 Xcode 3。我使用版本 3 创建 Settings.bundle 及其 plist,因为我发现 Xcode 4 的 plist 编辑器有些问题。
这些是我的 Root.plist 的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Authentication</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>User ID</string>
<key>Key</key>
<string>user_id_key</string>
<key>DefaultValue</key>
<string>1234</string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
</array>
</dict>
</plist>
我可以毫无问题地访问 iOS 设置菜单中的设置,还可以更改我目前拥有的单个条目的值。该值在 iOS 模拟器和我的物理 iOS 设备(iPhone 4)上的 session 之间存储。
不过,我似乎无法从我的代码中访问此值。让我向您展示我是如何尝试实现它的(在我的应用程序的 ViewController.m 中):
- (void)viewDidLoad
{
[super viewDidLoad];
myDefaults = [NSUserDefaults standardUserDefaults];
// DEBUG
userID = [myDefaults stringForKey:@"user_id_key"];
// userID = [NSString stringWithString:@"1234"];
// DEBUG
jsonBackendURL = @"http://example.com/jsonBackend.php";
passphrase = @"secretPassphrase";
theURLConnectionController = [[URLConnectionController alloc] initWithCallerObject:self];
[theURLConnectionController getConnectionAndUpdate:NO];
}
奇怪的是,当我尝试在 Xcode 3 中运行该应用程序时,我既没有收到任何错误消息(如 SIGABRT 等),也没有收到任何调试器输出。 iPhone 模拟器的屏幕在尝试启动应用程序时变黑了一会儿,然后我被带回了主屏幕。
Xcode 4 表现出一些相当奇怪的行为。它设法显示我的应用程序的用户界面一两秒钟,然后将我带回 iPhone 模拟器的主屏幕。它还在我尝试从 JSON 响应中获取值的代码中以某种方式指示 SIGABRT:
NSString *arrivalToday = [NSString stringWithString:[jsonResponse objectForKey:@"from"]];
由于 JSON 字符串是由 PHP 脚本使用我的应用程序传入的 GET 参数生成的(其中之一是来自 Settings.bundle 的用户 ID),所以这不起作用也就不足为奇了。但是它不应该崩溃,因为我在我的代码中早些时候发现了这个错误,但这可能与我的设置问题无关。一个真正令人头疼的问题是 Xcode(某种程度上)与我在 iPhone 模拟器中的应用程序一起崩溃。首先,Xcode 保持正常工作,除了我无法中止似乎仍在运行的程序这一事实。我可以单击 Xcode 中的停止按钮,但没有任何效果。当我尝试退出 Xcode 时,它询问我是否应该终止正在运行的程序,当我单击"is"时,它真的崩溃了,我不得不强制退出它。
幸运的是,Xcode 4 为我提供了我的应用程序的调用堆栈:
2011-07-21 11:41:04.539 OneClickCheckIn[2098:b303] http://example.com/json.php?user=(null)&pass=secretPassphrase&getStartToday
2011-07-21 11:41:04.888 OneClickCheckIn[2098:b303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithString:]: nil argument'
*** Call stack at first throw:
(
0 CoreFoundation 0x00de25a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x00f36313 objc_exception_throw + 44
2 CoreFoundation 0x00d9aef8 +[NSException raise:format:arguments:] + 136
3 CoreFoundation 0x00d9ae6a +[NSException raise:format:] + 58
4 Foundation 0x007ca14c -[NSPlaceholderString initWithString:] + 105
5 Foundation 0x007d3266 +[NSString stringWithString:] + 72
6 OneClickCheckIn 0x00002b5c -[OneClickCheckInViewController updateInterfaceWithJsonResponse:] + 172
7 OneClickCheckIn 0x0000e82c -[URLConnectionControllerDelegate connectionDidFinishLoading:] + 364
8 Foundation 0x007de112 -[NSURLConnection(NSURLConnectionReallyInternal) sendDidFinishLoading] + 108
9 Foundation 0x007de06b _NSURLConnectionDidFinishLoading + 133
10 CFNetwork 0x030fa48e _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 220
11 CFNetwork 0x031c56e1 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 293
12 CFNetwork 0x031c59cf _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 1043
13 CFNetwork 0x030f0c80 _ZN19URLConnectionClient13processEventsEv + 100
14 CFNetwork 0x030f0acf _ZN17MultiplexerSource7performEv + 251
15 CoreFoundation 0x00dc38ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
16 CoreFoundation 0x00d2188b __CFRunLoopDoSources0 + 571
17 CoreFoundation 0x00d20d86 __CFRunLoopRun + 470
18 CoreFoundation 0x00d20840 CFRunLoopRunSpecific + 208
19 CoreFoundation 0x00d20761 CFRunLoopRunInMode + 97
20 GraphicsServices 0x0101a1c4 GSEventRunModal + 217
21 GraphicsServices 0x0101a289 GSEventRun + 115
22 UIKit 0x00042c93 UIApplicationMain + 1160
23 OneClickCheckIn 0x00002609 main + 121
24 OneClickCheckIn 0x00002585 start + 53
25 ??? 0x00000001 0x0 + 1
)
terminate called throwing an exception(lldb)
这就是我现在想到的所有相关信息。我在 Google 上进行了广泛的研究,也阅读了该网站上的一些主题,但找不到解决方案。
最佳答案
我终于能够解决它,很大程度上要感谢上面提到的指南:Adding a settings bundle to an iPhone App .
上面写着:
[...] it is important to understand that until the user actually changes the value of the setting nothing is actually set. If you check for the setting in your application it will actually return nil unless you set a default value. To do that add the following to the applicationDidFinishLaunching (or didFinishLaunchingWithOptions) method:
// Set the application defaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"enableRotation"];
[defaults registerDefaults:appDefaults];
[defaults synchronize];
我没有意识到这一点。此外,在我看来,NSDictionary 中的值必须以某种形式初始化,否则用户以后的更改也不会生效(我一直在寻找时一次又一次地尝试更改 iPhone 模拟器中的值寻求解决方案,但没有奏效)。不过这可能只会影响 iPhone 模拟器,我还没有机会在我的物理设备上测试它。我的初始化代码现在看起来像这样(在 AppDelegate 中):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
@"1234", @"user_id_key",
@"http://example.com/json.php", @"json_url_key",
@"secretPassphrase", @"passphrase_key",
nil];
[defaults registerDefaults:appDefaults];
[defaults synchronize];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
使用该代码,我可以稍后在我的代码中轻松访问 NSUserDefaults 值:
- (void) reloadPreferences {
myDefaults = [NSUserDefaults standardUserDefaults];
userID = [myDefaults objectForKey:@"user_id_key"];
jsonBackendURL = [myDefaults objectForKey:@"json_url_key"];
passphrase = [myDefaults objectForKey:@"passphrase_key"];
}
我还花了一些时间寻找有关 NSDictionary 的键值对顺序的错误,直到我意识到在定义中值首先出现,然后是键。来自 Perl 背景,这对我来说有点陌生,因此如果您从 NSUserDefaults 对象获取 nil 值,可能需要注意这一点。
这花了我大约三天的时间来修复,所以我希望这个解决方案可能对某些人派上用场。 :-)
关于objective-c - 无法从 Settings.bundle 读取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6774491/
我有一组称为 nets 的整数集,我正在尝试对其进行迭代以确定是否已将来自或来自的整数添加到现有集合中;如果是这样,我将它们添加到现有集合中(这是为了跟踪电网中所有短路的组合)。 但是,我无法让 se
很奇怪:A 是一个集合,B 是一个集合的集合: Set A=new HashSet(); Set > B=new HashSet>(); 我给他们加了东西,输出 System.out.println
在 Agda 中,forall 的类型以这样的方式确定以下所有类型都是Set1 (其中 Set1 是 Set 的类型, A 的类型是 Set ): Set → A A → Set Set → Set
在 haskell 中我可以写一个函数 f where f :: Set a -> Set a -> Set a 如果我采用 Set Int 类型的两组 s1 和 s2,然后执行 f s1 s2 它将
在使用 Spring 时,我遇到了一个奇怪的问题。我有一个类,它接受一个集合作为输入,因为该类是底层框架的,所以我无法更改它。这是它的声明 private Set evaluate; public S
我是流的新手,我想通过将流操作应用于其条目集来修改 map ,但由于编译错误我无法这样做。 下面的代码只是创建了一个新的 map 对象并为其分配了一些整数值。然后它尝试通过在其条目集上应用流操作来删除
无论我看什么,我都会看到集合的输入是这样完成的: Set set = new HashSet(); 但是,我像这样定义我的集合 Set set = new HashSet(); 而且我仍然进行类型检查
我想对于 set -e 我可以捕获信号,但其他的我不知道。 最佳答案 为了完整性: set -e:如果命令失败则退出 set -u:如果在设置之前引用变量,则会出现错误 set -x:显示运行的命令
Set 维护唯一记录,并在尝试复制现有元素时更新现有记录。 考虑以下两种情况。您认为两者之间哪一个代码更快、更高效? 场景 1:使用 addAll() Set uniqueSet = new Hash
我在 Fedora 上做这个 问题: (sandbox)[root@localhost mysite]# django-admin.py runserver Error: Could not impo
https://codeforces.com/contest/1435/submission/96757666->使用set.upper_bound() https://codeforces.com/
使用 MySQL,我已将连接字符集设置为 UTF-8: SET NAMES 'utf8mb4'; SET CHARACTER SET 'utf8mb4'; 这样我就能以 UTF-8 格式返回所有内容,
在 Spring 3 MVC 中,我有一个称为 SettingsController 的 Controller ,它具有用于显示用户列表的 displayUsers()、saveUser() 和 de
我正在创建一个使用语法的程序,并查看该语法是否为 LL (1)。我想使用模块Set,但是我不知道如何进行,当然set的元素的类型是char,你能帮忙吗? 最佳答案 此答案假设您已经知道如何确定语法是否
好的,所以我重新整理了这篇文章,使其更容易理解(对所有的 Pastebin 感到抱歉,但堆栈溢出在代码格式化方面很愚蠢) 请注意,我不打算存储如下所述的大量数据。我使用我所说的数量的主要原因是为了尽可
我有一个密码,我保存在 Settings.settings 文件中并且我希望该部分被加密。 This是我得到的提示,但我真的不知道如何应用它。 谁能给我一个关于如何加密这样的密码的想法? 最佳答案 您
我在网上搜索并找到了如何在设置中添加特定的自定义数据类型。 我自己插入数据,而不是在程序运行时通过代码插入数据。我的问题是如何将自定义数据类型添加到设计器中的组合框。现在我想通了,需要建议,如何添加这
我一直在尝试将自定义类的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了六种不同的方法,包括 this way , this way , this way , 和 th
在 Visual Studio 2008 中调试我的项目时,我的 Settings.settings 文件在构建之间不断重置。有没有办法防止这种情况发生? 谢谢。 最佳答案 好的,我找到了我真正想要的
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 4年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!