在我的App中,我让用户更改主要主题颜色,然后相应地更新UI元素。我有一个导航控制器,它嵌入在选项卡栏控制器中。
该应用程序有两个选项卡,主屏幕(具有导航控制器)和设置选项卡(单个UIViewController)。当用户从设置页面更改主题颜色并返回主屏幕(即切换标签)时,UITableView中节标题的背景色不会更新。
我使用import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.resource.spi.security.PasswordCredential;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
/**
* This is an Authentication module that fetches credentials from a file
* This will be used in Cloud scenarios
*
*/
public class FileLoginModule implements LoginModule {
private static final Logger LOG = Logger.getLogger(MaterialLoginModule.class.getName());
private Subject subject;
private Map shared;
private Map options;
@Override
public void initialize(Subject subject, CallbackHandler handler, Map<String, ?> shared, Map<String, ?> options) {
this.subject = subject;
this.shared = shared;
this.options = options;
LOG.log(Level.INFO, "Options: {0}", options);
}
@Override
public boolean login() throws LoginException {
try {
String filePath = (String) this.options.get("creds");
LOG.log(Level.FINE, "Fetching credentials from {0}", filePath);
Path path = Paths.get(filePath);
List<String> lines = Files.readAllLines(path);
Iterator<String> it = lines.iterator();
this.shared.put("user", it.hasNext() ? it.next() : "");
this.shared.put("pass", it.hasNext() ? it.next().toCharArray() : null);
return true;
} catch (IOException e) {
LOG.log(Level.SEVERE, e.getMessage(), e);
}
return false;
}
@Override
public boolean commit() throws LoginException {
subject.getPrivateCredentials().add(new PasswordCredential((String) this.shared.get("user"), (char[]) this.shared.get("pass")));
LOG.log(Level.FINE, "Commiting...");
return true;
}
@Override
public boolean logout() throws LoginException {
LOG.log(Level.INFO, "logging OUT {0}");
return true;
}
@Override
public boolean abort() throws LoginException {
LOG.log(Level.INFO, "abort");
return true;
}
}
设置节标题的背景颜色,但是,显然,当用户在选项卡之间切换时,不会调用此方法。
我必须使用导航控制器(即导航到另一个视图并返回主屏幕)来更新UITableView节标题的颜色。
当用户从“设置”选项卡返回主屏幕时,如何更新颜色?
我使用Swift 4.1
谢谢
答案 0 :(得分:2)
您的任务的正确解决方案是使用通知。当用户更新设置时,请使用NotificationCenter
发布诸如“颜色方案已更改”之类的通知。
然后,发布此通知时需要执行操作的任何类都可以注册以接收此特定通知。
您可以让此视图控制器侦听通知并根据需要重新加载表视图。还需要根据通知进行自身更新的任何其他视图,控件或控制器也可以注册并根据需要进行自身更新。
与依赖其他事件(例如视图再次变得可见)相比,这是一个更好的解决方案。即使用户未更改任何设置,它也消除了每次查看视图控制器时不必要地重新加载表的情况。