更新UITableView节标题的背景色

时间:2018-10-02 20:48:45

标签: ios swift uitableview background-color uitableviewsectionheader

在我的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

谢谢

1 个答案:

答案 0 :(得分:2)

您的任务的正确解决方案是使用通知。当用户更新设置时,请使用NotificationCenter发布诸如“颜色方案已更改”之类的通知。

然后,发布此通知时需要执行操作的任何类都可以注册以接收此特定通知。

您可以让此视图控制器侦听通知并根据需要重新加载表视图。还需要根据通知进行自身更新的任何其他视图,控件或控制器也可以注册并根据需要进行自身更新。

与依赖其他事件(例如视图再次变得可见)相比,这是一个更好的解决方案。即使用户未更改任何设置,它也消除了每次查看视图控制器时不必要地重新加载表的情况。