Use UIRefreshControl without extending UITableViewController

Apple在iOS 6推出UIRefreshControl,替開發者解決最常用的下拉刷新效果。雖然網路上幾個third-party libraries真的不錯,像SVPullToRefresh幾行程式碼就可以辦到,但可惜久沒更新,畫面呈現實在不合我需求,來試試看原生的UIRefreshControl吧

實際用法很簡單,可以參考這篇iOS Programming 101: Implementing Pull-to-Refresh and Handling Empty Table
不過!網路上的教學都有個前提:使用UIRefreshControl的ViewController都必需繼承UITableViewController,也就是要長這樣
//MyViewController.h file
@interface MyViewController:UITableViewController
{
}
@end

這樣太不實際了,萬一舊專案在後期想要回頭使用UIRefreshControl,或是畫面本身非常複雜,豈不是要額外耗費時間去修改?!解決辦法很簡單,只要透過addSubview把UIRefreshControl加到你的table即可。實際程式碼如下
//MyViewController.h file
@interface MyViewController:UIViewController
{   
    @property(nonatomic, retain) UIRefreshControl *refreshControl;
    @property (weak, nonatomic) IBOutlet UITableView *tbl;
}
@end

//MyViewController.m file
@interface MyViewController () 
@end

@implementation MyViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    // get data
    [self getMyData];
    
    // Initialize the refresh control.
    self.refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl.backgroundColor = [UIColor purpleColor];
    self.refreshControl.tintColor = [UIColor whiteColor];
    self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@"下拉刷新"];
    [self.refreshControl addTarget:self
                            action:@selector(getMyData)
                  forControlEvents:UIControlEventValueChanged];
    [self.tbl addSubview:self.refreshControl];
}

- (void) getMyData {
    // 取資料
}

封裝iOS Framework遭遇各種error之解法

封裝....恩 其實用Xcode 6已經變得很簡單了,不多說~這邊只簡單紀錄一下我遇到的各種狀況

●問題一:image not found
  錯誤資訊
  dyld: Library not loaded: @rpath/authentication.framework/authentication
  Referenced from: /private/var/mobile/Containers/Bundle/Application/A122BB49-F6E0-4C2D-82EE-2933AAC02659/AuthenticationTest.app/AuthenticationTest
  Reason: image not found
 
  解決方式
  把library加入到Embedded Binaries


●問題二:無法載入Framework裡面的資源(例如xib檔)
  錯誤資訊
  Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle

  解決方式
  載入資源時要寫完整的Identifier


●問題三:無法載入Framework內的class
  錯誤資訊
  Symbol(s) not found for architecture armv7

  解決方式
  Framework在build的時候,要針對不同版本建立在Derived Data。也就是說要在模擬器跑就要create一個給模擬器用的Framework;反之,要在真機跑就要另外create一個給真機用的Framework


●問題四:輸出7.0為base的Framework,會有warning
  錯誤資訊
  Embedded dylibs/frameworks only run on iOS 8 or later

  解決方式
  不管他XD  https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1480


●問題五:Class重複存在(通常發生在引用相同的第三方library) 
  錯誤資訊
  Class DDURLParser is implemented in both

  解決方式
  把第三方元件統一封裝給所有專案用,而不是每個專案各自引用