【问题标题】:Why doesn't my view reload?为什么我的视图没有重新加载?
【发布时间】:2011-09-26 06:08:26
【问题描述】:

所以我在一个视图中有两个搜索栏、几个按钮和一个表格视图(是的,所有这些)。而且我还有一个导航栏,上面有一个返回按钮。

对于特定操作,我删除了所有搜索栏、按钮,并在我的视图中仅显示一个 uitableviewcell。

如果我按下编辑,我希望重新加载整个视图,而不仅仅是 tableView,而是我希望视图具有搜索栏和按钮以及导航屏幕。

我在edit按钮的IBAction中做了[self.view reloadInputViews]。控制在这里,但视图只是没有重新加载。为什么?

【问题讨论】:

    标签: iphone objective-c uitableview view reload


    【解决方案1】:

    reloadInputViews 专门用于作为 firstResponder 的视图。可能 self.view 不是当时的第一响应者。但是为什么要使用“reloadInputViews”来完成这一切,使用起来并不容易:[self.view setNeedsLayout]?

    【讨论】:

    • [self.view setNeedsLayout] 强制调用“layoutSubviews”方法;在这种方法中,根据“编辑”按钮状态(选择/未选择),您将通过显示/隐藏子视图和更改表格视图框架来重新布局您的视图;如果您也需要更改表格视图的内容,请调用 [tableView reloadData]
    【解决方案2】:

    处理刷新视图状态的更好方法是将 UIViewController 的视图子视图的配置抽象为自定义方法,您可以在最初从 viewDidLoad 调用该方法,然后再次作为 UIbarButtonItem 的操作调用。

    - (void)viewDidLoad {
        //Specific, non repeated view setup
        [self resetViewState];
    }
    
    - (void)resetViewState {
        //Repeatable view setup
    }
    

    之所以值得区分是因为viewDidLoad在视图延迟加载后被系统自动调用。按照设计,它不是每个视图应该多次调用的方法。如果视图被丢弃并重新创建,它将再次调用。

    如果您需要进行布局工作,您还可以将 UIViewController 的子视图的布局移动到 viewWillLayoutSubviews,这会在不同时间被系统调用。

    【讨论】:

      【解决方案3】:

      在 StackOverflow 上发布后,我不知道自己是如何得到答案的。抱歉给大家添麻烦了(叹气!)

      我做了[self viewDidLoad];

      【讨论】:

      • 这是一个非常古老的问题,但打电话给[self viewDidLoad] 并不是很好的做法。它可能适用于您提到的情况,但我提供了额外的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      相关资源
      最近更新 更多