【问题标题】:Objective-c How to reload a viewObjective-c 如何重新加载视图
【发布时间】:2013-02-01 12:50:37
【问题描述】:

我有一个检查互联网连接的页面,然后根据结果执行各种操作。例如,如果没有互联网连接,下载文件的按钮被禁用,导航栏中不存在某些按钮,某些文本颜色不同等。

我想添加一个“刷新”按钮,以便用户可以连接到互联网并重新加载页面。

我的问题是,如何刷新视图?调用 [self viewDidLoad];肯定是不对的,即使这是所有逻辑都存在的地方。我是否需要从 superView 中删除视图并重新插入它,或者有没有办法在不删除的情况下做到这一点?

谢谢

【问题讨论】:

  • 现在如何加载视图?来自viewDidLoad?然后您可以将代码移动到新方法“重新加载”并调用它
  • 您可能应该将该代码移至某个可达性通知回调,因为网络连接可以来来去去。
  • 我确实考虑过将 viewDidLoad 代码移动到一个新方法,但该代码基于 Internet 连接以编程方式将元素添加到页面。如果我在单击刷新按钮后再次调用该方法,所有这些元素将被再次添加......一次又一次......一次又一次。当然,我可以先删除所有页面元素(按钮、标签、图像等),但这似乎有点适得其反,尤其是考虑到随着时间的推移会向代码中添加更多项目。没有简单的重新加载页面的说明吗?
  • @user857903 检查我的答案,为什么不在 .h 文件中声明所有按钮,然后相应地启用和禁用按钮。它不会使您的代码大量返工
  • 对不起@P.J.不确定我是否理解。在我能够接受的所有答案中,我打勾的答案就是我将要做的那个……将元素放入 ViewDidLoad 并以新方法自定义它们。我知道您确实提到在 .h 文件中声明它们,但我无法接受附加到我原始问题的 cmets。你会打勾?不想冒犯任何人,尤其是在提供了所有帮助之后。

标签: objective-c refresh reload


【解决方案1】:

在单独的方法中编写刷新或查看设计的整个逻辑,并在再次刷新时调用它。

 ViewDidLoad
  {
    [self loadViewDesign];
  [[(uibutton *) addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventTouchUpInside];
  }

- (void)loadViewDesign
  {
     ....
       ...
        ..
     }

 - (void)refreshData
   {
 [self loadViewDesign];
   }

【讨论】:

  • 感谢您的所有帮助。有很多东西可以从中受益。我认为在这个例子中使用 Reachability 是一种矫枉过正,虽然我以前用过。按照给出的建议,我将在我的 .h 文件中声明元素,将它们定位在我的 viewDidLoad 中,并在新方法中自定义它们。我想我想知道的是“是否有一个可以简单地重新加载视图的单行代码”,但我从这些回复中收集到答案是否定的。再次感谢大家。
【解决方案2】:

如果您的功能是检查互联网,并且您使用的是 Apple 的Reachability 类,那么写

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

在你的viewDidLoad

然后写这段代码

-(void)startInternetAvailableCheck
{
    internetReach = [Reachability reachabilityForInternetConnection];
    [internetReach startNotifier];
    [self updateInterfaceWithReachability: internetReach];
}

-(void)updateInterfaceWithReachability:(Reachability*)curReach
{
    if(curReach == internetReach)
    {   
        NetworkStatus netStatus = [curReach currentReachabilityStatus];
        switch (netStatus)
        {
            case NotReachable:
            {
                MyLog(@"Access Not Available");

                break;
            }

            case ReachableViaWWAN:
            {
                MyLog(@"Reachable WWAN");

                break;
            }
            case ReachableViaWiFi:
            {
                MyLog(@"Reachable WiFi");

                break;
            }
        }

    }
}

//Called by Reachability whenever status changes.
- (void) reachabilityChanged: (NSNotification* )note
{
    Reachability* curReach = [note object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    [self updateInterfaceWithReachability: curReach];
}

在上面提到的updateInterfaceWithReachability 函数中,您可以更新您的视图,即相应地启用和禁用按钮。

希望对你有所帮助..

【讨论】:

    【解决方案3】:

    我会这样做:

    在 viewDidLoad 中,我将创建所有自定义 UI 元素。我什至可以在那里布局它们,除非布局有点动态地对数据本身做出反应。我只会创建一次 UIElements。

    在一个单独的方法中,我可能会命名为 configureView - 加载数据(除非这是异步的 - 我建议这样做) - 相应地设置 UI 元素。设置开关值、标签文本等。 - 可能布局元素或隐藏/取消隐藏它们或启用/禁用它们。

    在大多数情况下,我会从 viewDidLoad 调用 configureView。或者我会从 viewWillBecomeVisible 中调用它。在这种情况下,即使视图从任何其他推送视图返回或在选项卡栏中切换回它时变得可见,视图也会更新。

    刷新机制(可能是链接到按钮的操作)会重新加载数据,然后也调用 configureView 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多