34

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

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

4

13 回答 13

40

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

于 2013-10-20T17:32:31.827 回答
10

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

if (condition){
 //attach refreshControl
}

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

//End refresh control
[self.refreshControl endRefreshing];
//Remove refresh control to superview
[self.refreshControl removeFromSuperview];
于 2013-10-29T10:08:50.630 回答
9

尝试这个:

[self.refreshControl removeFromSuperview];
self.refreshControl = nil;
于 2013-10-23T18:55:09.073 回答
6

我在 set 时有不好的体验tableView.refreshConrol = nil,因为当我将它设置回 old 时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()

PS设置isHidden, isEnabled, isUserInteractionEnabled没有帮助

于 2019-01-31T13:33:22.057 回答
5

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

于 2016-02-10T11:24:50.353 回答
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。

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

于 2018-04-13T17:33:10.043 回答
1

您不能使用 删除 UIRefreshControl setEnabled:NO,因此您必须将其从它的 superview 中删除。我已尝试使用 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;
    }
} 

希望这对你有用。

于 2013-10-30T14:18:20.413 回答
1

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

目标 C

[self.refreshControl removeFromSuperview];

迅速

self.refreshControl.removeFromSuperview()
于 2018-01-18T07:35:02.400 回答
1

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

于 2019-02-13T16:34:47.990 回答
0
[refreshControl setTintColor:[UIColor clearColor]];

你也可以这样做:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0)
        scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
}
于 2013-10-23T18:51:03.540 回答
0

我是这样解决的:

-(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];
}
于 2015-06-04T14:55:45.903 回答
0

下面是实现 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;

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

于 2016-09-16T11:04:44.663 回答
0

尝试在 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()
    }
  }
于 2021-03-23T05:27:31.640 回答