2012-10-01 73 views
13

我想移動UIRefreshControl頂部的我的headerView或至少讓它與contentInset一起工作。任何人都知道如何使用它?UITableView和UIRefreshControl

我使用headerView在TableView內滾動時有一個很好的背景。我想有一個可滾動的背景。

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
// Set up the edit and add buttons. 

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
self.tableView.backgroundColor = [UIColor clearColor]; 

[self setWantsFullScreenLayout:YES]; 

self.tableView.contentInset = UIEdgeInsetsMake(-420, 0, -420, 0); 

UIImageView *top = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top.jpg"]]; 
self.tableView.tableHeaderView = top; 

UIImageView *bottom = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bottom.jpg"]]; 
self.tableView.tableFooterView = bottom; 

UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"settingsIcon"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings)]; 
self.navigationItem.leftBarButtonItem = leftButton; 

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addList)]; 
self.navigationItem.rightBarButtonItem = addButton; 

//Refresh Controls 
self.refreshControl = [[UIRefreshControl alloc] init]; 

[self.refreshControl addTarget:self action:@selector(refreshInvoked:forState:) forControlEvents:UIControlEventValueChanged]; 
} 

回答

32

我真的不知道你的意圖是與contentInset的東西是什麼,但在加入UIRefreshControl到一個UITableView而言,是可以做到的。 UIRefreshControl實際上是用於UITableViewController的,但是如果你只是將它作爲子視圖添加到UITableView中,它就會神奇地起作用。請注意,這是沒有記錄的行爲,可能在另一個iOS版本中不受支持,但它是合法的,因爲它不使用私有API。

- (void)viewDidLoad 
{ 
    ... 
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged]; 
    [self.myTableView addSubview:refreshControl]; 
} 

- (void)handleRefresh:(id)sender 
{ 
    // do your refresh here... 
} 

貸記@Keller for noticing this

+3

在一個普通的UIViewController裏面你沒有self.refreshControl,所以你完全錯了lensovet – Godfather

+0

偉大的建議... thx – paiego

+1

如果你的tableview有一個標題視圖(至少在iOS7上),這個方法有一些問題。在刷新時向下滾動時,表格部分全部不在位,由標題視圖的高度抵消。 – AlBeebe

10

@埃施朗的答案是現貨,但我有一個小小的建議。將刷新控件添加爲@property,以便稍後可以訪問它。

在YourViewController.h

在YourViewController.m

-(void) viewDidLoad { 
    self.refreshControl = [[UIRefreshControl alloc] init]; 
    [self.refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged]; 
    [self.tableView addSubview:self.refreshControl]; //assumes tableView is @property 
} 

而最大的理由做這樣

@property (nonatomic, strong) UIRefreshControl *refreshControl; 

...

-(void)refresh { 
    [self doSomeTask]; //calls [taskDone] when finished 
} 

-(void)taskDone { 
    [self.refreshControl endRefreshing]; 
} 

只是給你接收機類廣泛訪問UIRefreshControl,以便您可以結束刷新或檢查UIRefreshControl的isRefreshing屬性。

+1

'@property(nonatomic,strong)UIRefreshView * refreshControl;'你可能是指'UIRefreshControl'這裏。對? –

+0

@ self.name爲什麼它會在完成後調用'taskDone'?這讓我感到驚訝。實際上,它應該執行'taskDone'並且再次回來刷新,對嗎? +1雖然你的答案。 – Ron