2012-10-09 63 views
6

我試圖在我的應用程序中實現UIRefreshControl。我有一個xib文件,並且我在空的nib文件中添加了一個UITableViewController,並將refresh屬性設置爲「enabled」。此外,我已將代碼添加到viewDidLoad和自定義刷新方法。問題是我有一個錯誤,我找不到任何信息....我viewDidLoad我得到「財產‘refreshControl’上ViewController類型的對象未找到」UIRefreshControl問題

- (void)viewDidLoad{ 

[super viewDidLoad]; 

self.myTableView = 
[[UITableView alloc] initWithFrame:self.view.bounds 
          style:UITableViewStyleGrouped]; 

self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
            UIViewAutoresizingFlexibleHeight; 

self.myTableView.delegate = self; 
self.myTableView.dataSource = self; 

[self.view addSubview:self.myTableView]; 

UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
[refresh addTarget:self action:@selector(refreshView:) forControlEvents:UIControlEventValueChanged]; 

self.refreshControl = refresh; 

} 

-(void)refreshView:(UIRefreshControl *)refresh { 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."]; 

// custom refresh logic would be placed here... 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MMM d, h:mm a"]; 
NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@", 
           [formatter stringFromDate:[NSDate date]]]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated]; 
[refresh endRefreshing]; 

} 

我不知道爲什麼財產不可用....我錯過了什麼?

看起來我需要繼承我的ViewController.h文件中的UITableViewController。如果我已經有UITableView那我該如何繼承?如果我改變從ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>ViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>我的代碼,然後我得到一個錯誤:

error: NSInternalInconsistencyException', 
    reason: '-[UITableViewController loadView] loaded the "ViewController_iPhone" nib but didn't get a UITableView.' 

回答

11

可以作爲一個子視圖添加UIRefreshControlUITableView

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

根據戴夫的評論,這可能會在未來的iOS版本中打破。所以請謹慎使用此功能,並嘗試對此提出bug report to apple

更新: 更好的方法是通過增加UITableViewControllerself一個ChildViewController,然後加入tableViewController.tableViewself.view子視圖。你不必做任何破解就可以使它以這種方式工作。

[self addChildViewController:tableViewController]; 
[self.view addSubview:tableViewController.tableView]; 

您可以相應地爲tableView定義幀。使用此方法,UIRefreshControl應以與UITableViewController一樣的方式工作。 `

+3

這不受支持,可能會在iOS的未來版本中打破。 「UIRefreshControl」唯一支持的方式是使用「UITableViewController」。 –

+1

@ACB,這正是我需要的!感謝數百萬。我希望我能給你更多的道具! – brianhevans

+1

是的,您可以在UIViewController類上使用您手動添加的UITableView和來創建UIRefreshControl。評論的其他答案可能是真實的(它不符合文檔),但這個小小的黑客工作在iOS6上。 –

1

您的ViewController類必須是UITableViewController的子類才能訪問refreshControl屬性。

+0

我們可以添加'UITableViewController'作爲子視圖控制器,然後添加'tableview'作爲當前視圖控制器的'self.view'的子視圖,對吧?我只是想知道我們是否真的需要子類? – iDev

+0

@ACB是的,你可以使用'UITableViewController'作爲子視圖控制器。這是一個很好的方法。 –

+0

感謝您的確認。在您的回答中,我對這個陳述感到困惑***「ViewController類必須是UITableViewController的子類」***,因爲我們也可以將它作爲子視圖添加。 – iDev

5

的事情要記住:

  • UIRefreshControl只爲UITableViewController,所以你的類應該是UITableViewController的子類。

  • UITableViewController有一個屬性refreshControl,你應該分配UIRefreshControl 並將其設置到該屬性。

例:

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; 

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 

[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged]; 

tableViewController.refreshControl = refreshControl; 
+0

這是正確的答案。按照接受的答案手動將其添加到「UITableView」中可能會在將來的iOS版本中導致意外行爲。 – Samah

0

我會建議你做單獨的UITableViewController子類myTableView。 然後通過使用addChildviewController或iOS6 ContainerView在原始ViewController中添加該類。即使在View部分也是這樣,你可以使用UIRefreshControl。

接受的答案不是官方的方式,所以它可能會在未來的發佈中打破,因爲評論說...

2

所有這些都是一些簡單的事情。

您不需要添加刷新控件,或者在您的viewController中聲明一個。添加拉到刷新是一個兩步過程。
步驟1:在故事板中,轉到您的tableViewController,在其中顯示「刷新」的地方,選擇「啓用」。
步驟2:將以下代碼添加到您的tableViewController.m文件,在viewDidLoad中:

[self.refreshControl addTarget:self 
          action:@selector(refresh) 
        forControlEvents:UIControlEventValueChanged]; 

這是整個過程,比你-refresh方法做的東西等。當你想讓它停止刷新時,請致電[self.refreshControl endRefreshing];

+0

謝謝!我有一種感覺,我讀的所有教程都過於複雜。 –