使用基于 XIB 的选项卡栏应用程序在所有视图中“清除所有”文本字段中的值的最佳方式

Posted

技术标签:

【中文标题】使用基于 XIB 的选项卡栏应用程序在所有视图中“清除所有”文本字段中的值的最佳方式【英文标题】:Best way to "clear all" values in text fields in all views with XIB based tab bar application 【发布时间】:2013-09-05 01:40:56 【问题描述】:

我已经为此苦苦挣扎了很长一段时间,并且在这里和其他地方进行了大量研究,试图找出最好的前进方式。

我有一个带有四个选项卡的选项卡栏应用程序 - 其中三个选项卡接收用户输入和计算值。其中一些值被转发到其他视图(因为它们在相关计算中再次使用)。这不是我的问题 - 我能够在视图之间向前和向后发送数据,但我遇到的困难实际上是“清除”所有视图中的所有值以响应 UILongPress 手势识别器。我在计算结果的每个视图上都有一个“计算”按钮,以及一个用于清除显示视图上的值的“清除”按钮。

这是应用程序的第 2 版,我想通过允许用户按住任何视图上的清除按钮并清除所有值来扩展其功能。

似乎并不太难,但它确实适合我。

我研究过使用全局变量、单例、NSUserDefaults、NSNotification ——所有这些都没有运气。我还没有尝试过键值观察 (KVO),但我认为我的很多问题都源于我使用非常旧的代码这一事实——我的 AppDelegate.m 文件具有较旧的“DidFinishLaunching”方法而不是较新的方法“ApplicationDidFinishLaunchingWithOptions”另外,标签栏和视图控制器都是在 Interface Builder 中创建的,而不是像在较新的 XCode 标签栏模板中那样以编程方式创建。

我怀疑我的问题可能在于我对 viewWillAppear 和/或 viewDidLoad 的使用——我在每个 viewcontroller.m 文件中都使用了 viewWillAppear,而且效果很好。在这个的核心,我应该能够以某种方式设置一个全局 BOOL(“清除所有按下?”是或否),当视图出现时,查看该变量,如果是,设置相应的 uitextfield.text 属性为 nil -- 如果为 NO,则继续正常初始化并显示。)

我也尝试了 awakeFromNib,但没有运气。

在我发布任何代码之前,有人知道我可以尝试什么吗?感谢您提供的任何帮助!

【问题讨论】:

清除所有按钮激活时发布通知。所有视图控制器都观察到所述通知并清除它们在通知处理程序中负责的文本字段。 谢谢——这是我认为最合适的方法。一些后续问题——如果我要为此使用 BOOL,通知发送/接收代码的合适位置是什么以及在哪里?我猜是 appdelegate,然后是各自的视图控制器? 布尔值有什么用?应用程序委托需要做什么?我想象的很简单:在长按处理程序中发布通知;在 viewDidLoad 中订阅(酌情在 VC'a 中使用处理程序实现) 太好了,我会试一试的。多年来第一次在 Stack Overflow 上发帖,在这里我没有看到复选标记选项,也许是因为我太新了。我要试试这个,下面是凯文的方法——我会在可能的时候报告。感谢您的帮助! 【参考方案1】:

遍历 tabbarcontroller 中的所有视图控制器,然后遍历每个视图控制器视图的子视图,如果视图是文本字段,请将其清除。

- (void)clearAll

    for (UIViewController *vc in self.tabBarController.viewControllers) 
        for (UIView *view in vc.view.subviews) 
            if ([view isKindOfClass:[UITextField class]]) 
                UITextField *textField = (UITextField *)view;
                textField.text = nil;
            
        
    

【讨论】:

Kevin,这是一种我完全没有考虑过的干净、绝妙的方法。我很可能必须更新我古老的 ios 3.0 样式标签条码才能使用它,但无论如何我真的需要这样做。谢谢!【参考方案2】:

Swift 3 更新:

for view: UIView in self.view.subviews 
                if (view is UITextField) 
                    let textField: UITextField? = (view as? UITextField)
                    textField?.text = nil
                
            

更新:Swift 4

extension UIViewController
    public func clearAllTexts()
        for view in self.view.subviews
            if view is UITextField
                let field: UITextField = view as! UITextField
                field.text = ""
            
        
    

来电: self.clearAllTexts()

【讨论】:

【参考方案3】:

试试这个简单的解决方案。

for (UIView *view in [self.view subviews]) 
    if ([view isKindOfClass:[UITextField class]]) 
        UITextField *textField = (UITextField *)view;
        textField.text = @"";
    

【讨论】:

以上是关于使用基于 XIB 的选项卡栏应用程序在所有视图中“清除所有”文本字段中的值的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

如何根据设置选择在选项卡栏视图中创建动态更新的视图?

如何将选项卡栏添加到默认视图并使用导航控制器与其他视图通信

单击选项卡时,选项卡栏控制器不显示 XIB UIViewController

如何使用新数据重新加载或刷新选项卡栏控制器的选项卡栏中的数据?

如何以编程方式使用 Swift 3 在所有视图控制器中显示选项卡栏?

在三个视图控制器之间导航,其中三个视图控制器都在一个选项卡栏视图中