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

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

gradle錯誤 造成Android Studio無法安裝apk至device

如題,通常停止gradle即可。但是Android Studio沒有提供GUI協助我們做這件事 @"@

來下command吧

STEP 1 開啟命令視窗
在Windows作業系統請開啟cmd
在MAC作業系統開啟Terminal

STEP 2 前往專案root path

STEP 3 輸入終止指令
在Windows作業系統請輸入
gradlew --stop

在MAC作業系統請輸入
./gradlew --stop

收工...

參考資料

讓iOS TableView可以排序

更改TableView的cell排序,首先要開啟編輯狀態
[self.myTable  setEditing:YES  animated:YES];

此時TableView會長這樣

這不是我們要的效果,我們只要編輯順序,而不是編輯或刪除資料本身。
所以要實作下列二個method

// TableView可以排序
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}

// 實際排序的方式
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    MyDataItem *dataDict = [self.myDataSource objectAtIndex:fromIndexPath.row];
    [self.myDataSource removeObject:dataDict];
    [self.myDataSource insertObject:dataDict atIndex:toIndexPath.row];
}

作到這邊,的確是可以正確排序,但是~討厭的delete icon還是會出現在cell左側,要解決此狀況請再添加如下代碼

// Editing狀態下的TableCell不要出現紅色delete icon
- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
   // The editing style for a row is the kind of button displayed to the left of the cell when in editing mode.
    return UITableViewCellEditingStyleNone;
}

參考資料

iOS 8以上的模擬器多國語系失效

要測試多國語系,無論Apple或Android只要修改模擬器所套用的系統語言即可 。

在iOS 8以後的模擬器卻失效了!怎麼測都是英語@@

解法是透過Xcode修改專案Scheme


PS:除了Scheme,模擬器自身的語系也要改噢~不可只做其中一項
另外附上超強部落客AppCoda的多國語系教學Working with Localization in iOS 8 and Xcode 6

將Xcode現有專案加入Git

在Xcode建立專案通常會問你要不要加入Git


如果你跟我一樣從沒加過,請繼續看下去XD

STEP 1 開啟Terminal終端機 & cd到準備作Git的Xcode Project
其中cd的路徑只要到 "專案名稱.xcodeproj" 這一層即可
若不熟Mac Terminal cd用法,請參考[MAC] 小技巧 – 快速將終端機開啟在指定路徑下
STEP 2 初始化git
輸入git init
強烈建議先跳到STEP 4 & 5處理gitignore,完成後再繼續做STEP 3

STEP 3 加入git
輸入git add .
按下Enter
輸入git commit -m 'initial commit'
讓他跑一下,會出現上圖落落長的資訊
此時,重新開啟Xcode會發現本來反灰無法使用的Source Control可以用了!打開History也有了剛剛第一次Commit的紀錄


STEP 4 處理gitignore
cd回去專案目錄
輸入vim .gitignore

按下Enter

輸入 i 進入編輯模式


STEP 5 取GitHub取得gitignore資訊
前往github/gitignore抓取適合你的gitingore檔案,我的專案是用Objective-C寫的,所以抓gitignore/Objective-C.gitignore就好
接續前一步驟的編輯模式,複製gitignore/Objective-C.gitignore所有內容並貼至Terminal

貼上所有內容

按下Esc鍵
接著輸入:wq 
按下Enter


以上,全部做完就可以成功將現有專案加入git控管
但要注意的是,這只是local git,remote git就看你採用哪一家的,主要是前面的都做成功後,接下來就都用Xcode的Source Control操作就好

參考資料