【问题标题】:How do I "hide" a UIRefreshControl?如何“隐藏” UIRefreshControl?
【发布时间】:2013-10-29 02:42:50
【问题描述】:

有时我的表格视图不会连接到要刷新的服务,在这种情况下,我不希望 UIRefreshControl 出现。

在 viewDidLoad 中添加后,我尝试在某些情况下使用 setEnabled:setHidden: 隐藏它,但似乎都不起作用。

【问题讨论】:

  • 你可能会觉得这很有趣。我尝试对控件和表格视图进行子类化。我截获了寻找可以利用的东西的消息,但没有运气。最后,我用 tableview 覆盖了 -subviews 以隐藏控件,没有运气。最后,如果您所做的只是使用 addSubview 添加控件,则 tableview 会对其进行强引用。再多的隐藏、固定框架都行不通。

标签: ios objective-c uirefreshcontrol


【解决方案1】:

尝试在 Xcode 12 上使用来自 iOS_Mouse 的此解决方案。IOS 14.4.1 但无法正常工作。设法将其调整为这样。 (请注意,这是针对我使用 UISegmentedControl 的用例。我有不同的表,其中只有 1 个我希望能够使用 Pull To Refresh 功能。

  var refreshControl = UIRefreshControl()

      @IBAction func vcLibFilterPressed(_ sender: UISegmentedControl) {
        removeRefreshControl()
        switch vcLibSegmentedControl.selectedSegmentIndex {
        
        case 0:        // Plan
          enableDisableSegmentedControl()
          vcLibTableView.reloadData()
          
          
        case 1:        // Tag
          vcLibTableView.reloadData()
          createRefreshControl()
    
        default:
          break
        }
      }


  func createRefreshControl() {
    refreshControl.addTarget(self, action: #selector(syncDropbox), for: .valueChanged)
    refreshControl.tintColor = UIColor.red
    refreshControl.attributedTitle = NSAttributedString(string: " ↓ Refresh ↓ ")
    tableView.refreshControl = refreshControl
  }

  func removeRefreshControl() {
    refreshControl.removeTarget(self, action: #selector(syncDropbox), for: .valueChanged)
    tableView.refreshControl = nil
  }
  
  
  @objc func syncDropbox(refreshControl: UIRefreshControl) {
    if vcLibSegmentedControl.selectedSegmentIndex == 1 {
      // DO Internet Stuffs

      // somewhere in your code you might need to call:
      refreshControl.endRefreshing()
    }
  }

【讨论】:

    【解决方案2】:

    一个老问题,但我一直在寻找答案,但没有什么能完全符合我的要求。

    这对我有用:

    斯威夫特 4

    func createRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl?.addTarget(self, action: #selector(self.myTableRefreshFunction), for: UIControlEvents.valueChanged)
        refreshControl?.tintColor = UIColor.white
        refreshControl?.endRefreshing()
    }
    
    func removeRefreshControl() {
        refreshControl?.removeTarget(self, action: #selector(self.myTableRefreshFunction), for: UIControlEvents.valueChanged)
        refreshControl = nil
    }
    

    当我想要创建控件时我调用 createRefreshControl(),当我想要删除它时调用 removeRefreshControl。

    我必须删除我最初添加到刷新控件的相同目标,否则它会在实际删除之前刷新一次。

    【讨论】:

      【解决方案3】:

      我通过在刷新函数中调用"yourRefreshControl".endEditing()解决了这个问题。

      【讨论】:

        【解决方案4】:

        我在设置 tableView.refreshConrol = nil 时遇到了不好的体验,因为当我将它设置回旧的 refreshControl 时,它只在一秒钟内开始动画,所以看起来不太好,所以当我需要禁用 refreshControl 时我使用:

        tableView.refreshControl?.endRefreshing()
        tableView.refreshControl?.alpha = 0
        

        当我需要它时,我会使用:

        tableView.refreshControl?.alpha = 1
        // and if I need to show refreshing indicator immediately I write:
        tableView.refreshControl?.beginRefreshing()
        

        附:设置isHidden, isEnabled, isUserInteractionEnabled 没有帮助

        【讨论】:

          【解决方案5】:

          隐藏刷新控制并避免警告只需使用

          目标 C

          [self.refreshControl removeFromSuperview];

          斯威夫特

          self.refreshControl.removeFromSuperview()
          

          【讨论】:

            【解决方案6】:

            最好的实现 UIRefreshControl 如下。

             -(void)addRefreshControll{
                self.refreshControl=[[UIRefreshControl alloc] init];
                self.refreshControl.tintColor=[UIColor colorWithRed:0 green:183.0/255.0 blue:213/255.0 alpha:1.0];
                self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@"Loading history..."];
                [self.refreshControl addTarget:self action:@selector(loadMoreChatFromCoreData) forControlEvents:UIControlEventValueChanged];
                self.tableView.refreshControl = self.refreshControl;
            }
            

            当没有更多记录要加载时,通过下面的行删除 refreshControl

            self.tableView.refreshControl = nil;
            

            我已经实现了同样的工作正常。

            【讨论】:

              【解决方案7】:

              您可以尝试一个非常简单的解决方案:[self.refreshControl removeFromSuperview];

              【讨论】:

                【解决方案8】:

                我是这样解决的:

                -(void)updateUIWithAuthState:(BOOL)isAuthenticated {
                    self.loginButton.enabled = !isAuthenticated;
                    self.loginButton.tintColor = isAuthenticated ? [UIColor clearColor] : nil;
                
                    self.logoutButton.enabled = isAuthenticated;
                    self.logoutButton.tintColor = isAuthenticated ? nil : [UIColor clearColor];
                
                    self.tableView.userInteractionEnabled = isAuthenticated;
                    self.data = nil;
                    [self.tableView reloadData];
                }
                

                【讨论】:

                  【解决方案9】:

                  您无法使用setEnabled:NO 删除 UIRefreshControl,因此您必须将其从其超级视图中删除。我已尝试使用 Apple 提供的 Reachability 类的示例。

                  要添加 UIRefreshControl,您可以使用:

                  UIRefreshControl *refContr=[[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
                          [refContr setTintColor:[UIColor blueColor]];
                          [refContr setBackgroundColor:[UIColor greenColor]];
                  
                      [self.view addSubview:refContr];
                      [refContr setAutoresizingMask:(UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin)];        
                      [refContr addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
                  

                  然后实现可达性类通知:

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

                  您可以通过使用 bool 标志来检查连接性来做到这一点,这里我提供了这个示例,使用苹果的可达性类来检查我的连接性。

                  switch (netStatus)
                  {
                      case NotReachable:        {
                  
                           for (UIRefreshControl *subView in [myView subviews]) {
                               if ([subview isKindOfClass:[UIRefreshControl class]]) {
                                   [subView removeFromSuperview];
                               }
                           }
                            //or you could use [UIRefreshControl setHidden:YES];
                  
                            connectionRequired = YES;
                            break;
                      }
                  
                      case ReachableViaWiFi:        {
                           for (UIRefreshControl *subView in [myView subviews]) {
                               if ([subview isKindOfClass:[UIRefreshControl class]]) {
                                   [subview removeFromSuperview];
                               }else{
                                 [self.view addSubview:refContr];
                           }
                           //or you could use [UIRefreshControl setHidden:NO];
                          break;
                      }
                  } 
                  

                  希望这对你有用。

                  【讨论】:

                  • 如果 ReachableViaWiFi 您将被添加 n = myView.subviews.count of refreshControls,认为这是不希望的行为
                  【解决方案10】:

                  您有几种方法可以做到这一点。 我认为最好的方法是检查 viewDidLoad 方法:

                  if (condition){
                   //attach refreshControl
                  }
                  

                  如果这不可能,最好的方法是将此代码放在您要隐藏刷新的位置(我认为在 if 条件下的 viewWillAppear 方法中)

                  //End refresh control
                  [self.refreshControl endRefreshing];
                  //Remove refresh control to superview
                  [self.refreshControl removeFromSuperview];
                  

                  【讨论】:

                  • 这很好: //结束刷新控制 [self.refreshControl endRefreshing];
                  【解决方案11】:
                  [refreshControl setTintColor:[UIColor clearColor]];
                  

                  你也可以这样做:

                  - (void)scrollViewDidScroll:(UIScrollView *)scrollView
                  {
                      if (scrollView.contentOffset.y < 0)
                          scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
                  }
                  

                  【讨论】:

                  • 不会阻止控件触发刷新
                  【解决方案12】:

                  试试这个:

                  [self.refreshControl removeFromSuperview];
                  self.refreshControl = nil;
                  

                  【讨论】:

                    【解决方案13】:

                    尝试将表格视图控制器的 refreshControl 属性设置为 nil。

                    【讨论】:

                    • 如果我在 viewDidAppear 中进行检查(如果有要连接的服务则设置它,如果没有则设置为 nil)当我使用刷新控件重新加载视图时收到以下警告在我删除服务后在其中:“强烈建议不要尝试在刷新控制不空闲时更改它,并且可能无法正常工作。” (虽然它看起来确实有效。)
                    • 好的,我建议在删除之前在刷新控件上调用endRefreshing。您也可以尝试在 viewWillAppear 而不是 viewDidAppear 中执行此操作。
                    • [self.refreshControl endRefreshing]; 如果在 self.refreshControl = nil; 之前调用,仍会触发该警告。
                    • 我刚刚尝试过,只要在UIControlEventValueChanged 触发方法和endRefreshing 方法之外被调用,self.refreshControl = nil; 就可以完美地为我工作。我唯一的建议是插入记录刷新调用的开始/结束和nil 分配调用,以确保在发生刷新事件时不会发生分配。
                    • 这也是我的第一次尝试;来到SO寻找答案,因为在将控件设置为nil之前首先调用endRefreshing仍然给我警告(是的,我已经记录了调用并确保endRefreshing被调用之前 i> 将控件设置为nil)。还有其他想法吗? -- 编辑:作为附加措施;我还在endRefreshing 之后添加了dispatch_after,因此控件将在10 秒后设置为nil。可悲的是,我仍然收到警告。 -- 另一个编辑:在dispatch_after 记录控件的isRefreshing 中返回NO,但仍然收到消息
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-06-28
                    • 1970-01-01
                    • 2013-01-22
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多