我查看了Apple appPrefs代码示例,但这似乎仅适用于导航控制器。我正在使用iPad UISplitViewController,它具有简单的root和detail VC。
我可以更改某些设置(颜色,日期格式等)但是目前,我必须重新启动应用才能进行更改。我不想重新启动应用程序。
我正在使用每次应用启动时加载设置的系统。我可以使用通知系统,但我不知道如何重新加载视图控制器。
任何想法如何做到这一点(我想以某种方式重新加载视图)。
感谢您提供任何建议/建议。如果相关,我可以发布一些代码。
答案 0 :(得分:2)
如果您使用settings bundle to manage preferences from the Settings app
:
根据您在问题中的说法,您已经知道如何在应用变为有效时收到通知(UIApplicationDidBecomeActiveNotification
),对吗?
如果是这样,唯一的问题是如何在收到通知后重新加载视图。除了可以通过调用UITableView
轻松重新加载的[tableView reloadData]
之外,您必须通过为最初设置时要重新加载的UI控件分配值来重新加载视图。假设您要使用新设置的首选项值重新加载UILabel
标签,您只需编写如下代码:
- (void)reloadView {
label.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"PreferenceKey"];
self.view.background = …
[self.tableView reloadData];
}
- (void)reloadViewOnAppActivation:(NSNotification *)notif {
[self reloadView];
}
如果您使用的是in app preferences setting
:
如果首选项视图控制器不与SplitViewController同时显示。在控制器的viewWillAppear:
方法中重新加载您的视图:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self reloadView]; // See the definition of reloadView above
}
否则,将SplitViewController作为委托人的委托,或者将其分配给首选项视图控制器的ivar,并在适当时通知它首选项更改 - 如果您更喜欢实时更新,请立即更改任何单个首选项,或者如果您更喜欢批量更新,则完成所有更改后:
// SplitViewController methods:
- (void)preferencesAreChanged {
[self reloadView]; // See the definition of reloadView above
}
// Preferences view controller methods:
// Immediate update, use a preference controlled by a `UISegmentedControl` as an example
- (void)viewDidLoad {
[super viewDidLoad];
…
[segmentedControl addTarget:self action:@selector(xPreferenceTogglingAction:) forControlEvents:UIControlEventValueChanged];
…
}
- (IBAction)xPreferenceTogglingAction:(id)sender {
// Update the x preference.
…
[delegate preferencesAreChanged];
}
// Batch update
- (void)viewWillDisappear:(BOOL)animated {
[delegate preferencesAreChanged];
[super viewWillDisappear:animated];
}
答案 1 :(得分:1)
所以,为了帮助别人,我会发布我(在Apple的帮助下)解决了这个问题。
在根视图和详细视图控制器中,我根据用户设置添加了样式:
“Warm Tones”,“Cool Tones”,“Leather”等。这些转换为这样的代码:
switch (styleKey) {
case 0: // BASIC
fontName = @"Copperplate";
fontSize = 16;
selectedBarColor = [UIColor lightGrayColor];
selectedTintColor = [UIColor lightGrayColor];
selectedFontColor = [UIColor darkGrayColor];
backgroundColor = [UIColor whiteColor];
selectedHighlightColor = UITableViewCellSelectionStyleGray;
backgroundImage = nil;
detailBackgroundImage = nil;
break;
然后,无论何时调用颜色/样式/字体,我都使用这样的东西:
cell.selectionStyle = selectedHighlightColor;
cell.backgroundColor = backgroundColor;
这允许我更改设置和样式,但每次我都必须重新启动应用程序以查看更改。
修复结果很简单。
设置样式更改了常量的值(例如fontColor) - 但我实际上并没有更改字段。
所以在switch语句结束时,我添加的内容是这样的:
self.tableView.backgroundColor = backgroundColor;
self.navigationController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:backgroundImage]];
self.navigationController.navigationBar.tintColor = selectedBarColor;
self.tableView.separatorColor = selectedTintColor;
我必须在两个视图控制器中执行此操作。
此外,所有这些代码都是例程(changeSettings)的一部分。
正在观察此方法寻找变化。
我处理应用内偏好外观(模态VC)的方式是使用了极好的InAppSettingsKit。
我希望这有助于其他人。你们中的大多数人会发现这是我所期待的,但是 - 没有多少脑子离开 - 我花了两周的时间来弄清楚它。