[iOS] 搜尋控制器客制按鈕
先前有提過搜尋控制器 (Search Controller),現在想要讓搜尋控制器客制按鈕,預設只有一個取消按鈕,那我們怎麼讓它變成兩個按鈕呢?

前一陣子介紹圖解APP訊息推播流程,是關於iOS和Android兩大平台從發送到接收的整個過程,現在我們想要實作處理推送通知 (Process Push Notification),iOS SDK已經包好方法只要註冊成功後,就能透過某個method來繼續接下來的處理。可以先參考圖解蘋果推播通知服務 (Apple Push Notification Service)。

UIAlertView已經被棄用,iOS 8開始由UIAlertController取代它囉!如此變得更親切迷人~

過去能透過UIAlertView做出可填寫欄位UITextField,現在UIAlertController也能實現,而且更加方便好操作。
例如上圖程式碼這麼寫:
/**
Theme: UIAlertController
IDE: Xcode 7
Language: Objective C
Date: 105/03/30
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"修改暱稱"
message:@""
preferredStyle:UIAlertControllerStyleAlert];
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
// optionally configure the text field
textField.keyboardType = UIKeyboardTypeDefault;
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"送出"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
UITextField *textField = [alert.textFields firstObject];
}];
[alert addAction:okAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];
看要增加幾個選項按鈕都可以,而且都是用Block來做後續處理,不用再像過去還要跳來跳去的Delegate。
想要讓App使用者體驗好一點,就少不了讓人驚喜的動畫效果,於是視圖動畫 (View to Animation)可以在關鍵互動的時候使用!
開發App迭代十分快速,時常要更改版本號碼Version Number和建置號碼Build Number,如此容易區隔每個版本,測試員回報問題也能輕易對照。
Version Number制定規則比較直覺,一直都是從1.0.0開始,feature有大更新就變2.0.0,feature只有小變動就改2.1.0,bug偶爾修掉就微調為2.1.1。
Build Number可以怎麼做呢?我習慣將它設定為日期+時間,比如今天日期:160324・時間0111,合起來就是1603240111,當收集到Crash報告或bug清單,對照Git版本控制,就能知道當時的問題所在!
過去我們都是手動去更改BN,現在有更聰明的作法,就是在Xcode的Build Phases加入Run Script,接著按編譯(Command + B),就能在General的Build看到自動更換為當時的日期時間。
加入這幾行Run Script就好囉⋯⋯
timestamp() {
#date +" at %H:%M:%S on %m/%d/%Y"
date +“%y%m%d%H%M"
}
buildNumber=$(/usr/libexec/PlistBuddy -c “Print CFBundleVersion" “${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(timestamp)
/usr/libexec/PlistBuddy -c “Set :CFBundleVersion $buildNumber" “${PROJECT_DIR}/${INFOPLIST_FILE}"
看不太懂沒關係,反正這只設定那麼一次XD~

設定Run Script

編譯後Build自動變更
我們總以為只能使用內建的導覽動畫,這個功能也就是要進入下一頁面時會出現的行為,從右往左推進來是iOS一直以來預設動畫,而回上一頁則是從左往右推回去。

現在我們想要呈現不一樣的效果,此時就要客製化導覽動畫 (Customize Navigation Animation)。
下載影像到App中已不是問題,那麼上傳影像到伺服器呢?原本想要使用世界最知名的第三方套件AFNetworking,可是我怎麼嘗試都有錯誤,以為伺服器沒有做好,然而Android工程師和我們新的PM測試都可以成功,那麼一定是我這邊出了問題。

最後打算用原生的方式實作,寫法搞了一會兒,終於回傳成功!
我們時常有個需求,就是去判斷數字與字母的規則,比如身份證字號是一個大寫字母+九個數字。判斷方法有很多種,這裡有個非常方便的技巧,就是使用正規表達式 (Regular Expression)。
我可以這麼寫⋯⋯
/**
Theme: Regular Expression
IDE: Xcode 7
Language: Objective C
Date: 105/03/05
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
NSString *errorMessage;
// 確認身分證字號格式
NSString *phoneNumber = @“L123456789";
NSString *phoneRegex = @"[A-Z][0-9]{9}";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
BOOL matches = [test evaluateWithObject:phoneNumber];
if (!matches) {
errorMessage = @"身份證字號第一碼英文+後9碼為數字";
}
看了以上的程式片段,就知道如何使用了吧!
那其實正規表達式還有很多種用法,就拿StackOverFlow高人指點的例子⋯⋯
How to validate a phone number (NSString *) in objective-c? Rules:
實作解答如下:
NSString *phoneNumber = ...;
NSString *phoneRegex = @"[235689][0-9]{6}([0-9]{3})?";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
BOOL matches = [test evaluateWithObject:phoneNumber];
參考:Objective-c regex to check phone number。
。
睽違一年半之久,總算要來開發iBeacon,看來越來越多應用持續出現中!因為最近要出國,所以想到可以將iBeacon放進行李廂,進入範圍或離開範圍時,手機會跳出提示,如此就不用眼睛一直盯著行李箱:)~
一年半前參加「Retail Battle Hackathon 創新零售駭客松活動」,KKLabs給參賽者每人一顆Spot Beacon當作禮物,直到最近我才真正拿出來用XD~
可以先參考之前的文章:初探 IBEACON 技術。
HappyMan・迴響