我看过Apple appPrefs代码示例,但这似乎只适用于导航控制器。我正在使用一个iPad UISplitViewController,它有简单的根和详细的vc。
我可以更改某些设置(颜色,日期格式等),但目前,我必须重新启动应用程序,以使更改生效。我不希望重新启动应用程序。
我使用的是每次应用程序启动时加载设置的系统。我可以让通知系统工作,但我不知道如何重载视图控制器。
有什么想法吗(我猜是重新加载视图)
谢谢你的提示/建议。我可以张贴一些代码,如果相关的
-
如果您使用
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
:-
如果preferences视图控制器没有与SplitViewController同时显示。在控制器的
viewWillAppear:
方法中重新加载视图:- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self reloadView]; // See the definition of reloadView above }
-
否则,将SplitViewController作为preferences视图控制器的委托,或者将其分配给一个变量,并在适当的时候通知它preferences的变化-如果您喜欢实时更新,则在更改任何单个首选项之后立即通知它,或者如果您喜欢批量更新,则在所有更改完成后通知它:
// 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]; }
-
所以,为了帮助别人,我将发布我是如何(在苹果的帮助下)解决这个问题的。
在根视图控制器和细节视图控制器中,我添加了基于用户设置的样式:
"暖色调","冷色调","皮革"等。这些转换成这样的代码:
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;
我必须在两个视图控制器中都这样做
而且,所有这些代码都是例程(changessettings)的一部分。
这个方法正在被观察以查找更改。
我处理应用内偏好的方式是使用很棒的InAppSettingsKit。
我希望这有助于别人。我想你们中的大多数人会觉得这很简单,但是——我的脑子已经不多了——我花了两周时间才弄明白。