[course 2 ] 20180302觀念教學

Jameskrauser Lee
10 min readMar 4, 2018

--

重要:請以概念為主,細節內容也許有新的實作方法名稱

1.使用者痕跡:透過用Stack把使用過的畫面存下來,當要回上一頁B時,就是用Stack pop出來。
這樣B這一頁的記憶體才是真的上一頁使用者用過的!

2.堆疊:
未來是在穿戴裝置,要省硬體資源。
「IOS」用Navigation Bar來做跳頁,才有用堆疊存下畫面。
系統資源只有在未來會用到的畫面才須存在Stack記憶體之中。

像我上次作業是用segue identifier去拉C回去B的畫面,其實是再新立一個全新的B畫面,此時會再用掉一次手機記憶體,這是錯的寫法,你之後去檢查這二次B畫面的記憶體位置是不一樣的!
這種寫法在當你APP畫面達到四十個左右時,會發現怎麼當我只是一直在按下一頁,或上一頁之間在切換,但是怎麼記憶體一直瘋狂上升!

IOS:有三個畫面,A,B,C。
A為首頁,先由A畫面到B畫面,再換到C畫面(做pop回去),最後再回B畫面。

IOS:
依順序放入A,B,C。

只有最上面的是顯示在畫面上的

上圖為例:
android在使用者由畫面A->B->C->D->D2->E ,當想要換到畫面D1時,android是直接new一個D1畫面。
那這時,D1的上一頁就變成是E,而不是理論上的D了。
此時android就必須對Stack用「抽換」。

android系統是,當使用者用了幾個畫面,就把它全部放在記憶體中。

而IOS在E要換到D1時,IOS要檢查Stack中所有的項目,如果D1是存在STACK中, 就用pop的方式回去D1。如果D1不存在於STACK中,才new一個D1畫面。
IOS系統是,只會存下當下及之前用過的畫面才會存下資源。

3.畫面切換流程圖 (上次課程教學重點)
網頁的流程圖跟APP的流程圖在處理使用者痕跡是很大的不同的。
android在處理這塊,變成是另外在系統中,再跑一個garbage collection去把空閒資源的釋放,所以往往android APP的效能比IOS還要差。

Objective-C
方法是用中括號 [ 物件 方法 ]
屬性是用逗號

主管規定:
不要從Button拉出segue。
[原因是當畫面有三個按鈕,所以除了要換三個segue後,還是要用switch去做判斷。之後,專案太忙,很有可能造成debug困難,易出錯]
應該是要從viewcontroller拉出segue,再拖到另一個畫面上,並且要用perform_segue語法去啟動

不要用prepareForSegue(),而是要用performSegue()

二個畫面之間,只能有一個segue。名字設成GoToB_className。

不可以在GUI元件上用手打入文字,只能留空白。
元件上的文字只能用讀檔案的方法。
因為之後,如果畫面有八十個,如果是用讀檔顯示元件文件,當要換語系,就只要改一個文字檔就好了,如果沒讀成功,元件會是空白,就很好debug。

進場動畫:
Push(Show):會進Navigation堆疊,會記下使用者痕跡。畫面是由左往右顯示。

Present(Modally):不會進Navigation堆疊,不會記下使用者痕跡。畫面是由下往上顯示。

以上二者的進場方式,其實可以調整是由下往上顯示或由左往右顯示。

用意:
有些在一連串動作,開相機這一個動作是不要放入使用者痕跡,所以這一動作會要改成Present。

StoryBoard Segue的kind

如果一直用Present的換頁到最後,當使用者要回首頁後,只能再new一個首頁,但此時,原本首頁輸入的資訊會不見,所以變成要寫的function先存下使用者輸入的資訊,再把這個資訊寫回首頁。

[笑話]
android的人笑,有些功能安卓系統都出來二,三年了,iOS才有提供,真LOW。

但是WWDC全球開發大會,能去的都是各地的頂級高手,他們會是笨蛋嗎?
同一個功能,在IOS只要二核心,記憶體16G就可以跑很順,但android卻要七核心,記憶體128G才能跑的順。

有看到NavigationBar就代表畫面有進了堆疊。但是在實際APP運作時,是可以改成穩形的!

[Navigation Bar]
重點:要自己真的去了解Navigation Bar

Navigation Bar 的概念有四大區塊,以上圖所示。
中間只能放view,但view裡面可以放別的東西。
左方List區塊,預設是back鍵。

如果你要保留back鍵,又要在右方加入好幾個按鈕,此時back鍵會被你新加按鈕給擠掉。解法:重新設計Navigation Bar的左方List,就可以解決。

另外xcode 的back鍵,預設藍色的《 符號,apple是不開放這個元件,導致現在APP的back鍵,有些是自己要畫。

技巧:
原本有個用往左滑的手勢「用推的」,可以回上一頁。
要怎麼把這個功能關掉。

解決方法:把back鍵給替換掉就好了。因為用手勢回推時,是透過back鍵內鍵功能提供的API。

重點:
Segue id = GoTo + className+viewController
storyboard id = className

IOS中 push切換畫面有一種方式

IOS中 pop切換畫面有三種方式
1.popViewControllerAnimated回到上一頁
[self.navigationController popViewControllerAnimated:YES];

2.poptoView回到某一頁(使用者指定)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];

3.popToRootViewControllerAnimated 回到首頁
[self.navigationController popToRootViewControllerAnimated:YES];

presentViewController: 往去下一頁
[ self.navigationController presentViewController:controllerName animated:YES completion:nil];

dismissViewControllerAnimated:回去上一頁
[ self.navigationController dismissViewControllerAnimated:YES completion:nil ];

重點:下圖紅色的元件名字,千萬不要改,請保留原本的名字。不然有時IDE會出現很怪的問題,最後只能把畫面整個砍掉,重拉!
因為xcode原來設計是當你程式都寫好才能改!

重點:
命名規定是GoToXXX。XXX是className-viewController

Android的Flag技術
在Stack用抽換技術,保持好次序。

當Android的次序亂了,可以用FLAG技術去抽換,把次序還原。

重點:
Tab Bar Controller: 一開始是IOS獨有的功能。

管理堆疊(頻道)
一個頻道 = 一個流程

重點:
一個APP最好只有一個Tab Bar Controller。
如果有二個Tab bar controller以上,千萬不能讓流程交互可以互跳畫面!應該要用一個主要頻道去管理次頻道,避免掉這個問題。「有問題!」
IOS也要去自學checkbox及radiobox,因為IOS沒有!

Tab Bar Controller 會有個陣列會存下,每一個畫面當作使用者痕跡。

重點:
在Tab Bar Controller中,最好用Navigation bar。

例子:
Tab Bar Controller 下有四個item , A , B , C ,D 一共有四個的頻道。
當使用者先去看A的畫面,再由A1看到A4後,切換到C,再由C1看到C3,
最後,再切回A,請問此時畫面是顯示A1還是A5?
答案: A5

要當一個優秀的iOS工程師,必須要了解IOS系統的設計概念,不是只把,語法或API練到很熟而己。
否則,未來遇到一些奇怪的錯誤,會不知道怎麼解,可能連抓思考方向都不會!!

Retain Count
在每一個記憶體變數前方,多給一個int去存下,目前有多少物件正在使用我?

從小地方看,APPLE公司的設計,多浪費一個INT空間。當初業界一堆人在笑這個設計。
但是從大角度去看,之後當系統有上萬個變數,IOS 就不必像Android另外需要再開一個類似Gargabe Collection的小系統去把APP中沒用的變數給釋放!
所以IOS的APP大多數都比Android的APP還要省手機硬體資源。

一點小改變,會累積成大改革!

Objective-C

Array:宣告後,就不可以改變。
Mutable Array:宣告後,還可以改變。
-int 不可以直接存入Mutabble Array,因為Mutable Array只能放物件(記憶體位置)!

PS:List什麼型別資料都可以存。
像數字1到9,或英文字母A到Z,在IOS系統中,因為太常用了,Apple就己經預設給他值來代表。

如果要存數字,應該用NSNumber先對數字轉型,再存入Array。
NSString中給值的表示法
@"xxx" 前方有@代表這個是物件
“xxx”前方沒有@代表這個是字串

那為什麼有了Array還要有List
-List 省效能-不必存物件,release就release。
-Array比較安全- 因為有retain的機制。

Dictionary: 必須要有key和value。

mutable Dictionary

Apple很喜歡教育使用者
sizeClass: 在XIB末期,apple公司開發出來的,但是大家都不想用,因為預設畫面就跟apple手機一樣,覺的學sizeClass是在浪費時間。Apple公司後來就不高興,把xcode的預設GUI改成是600x600的正方形,故意強迫開發人員去了解。

好像過了一年還二年,apple看大家都會用sizeClass了,才把後來xcode預設GUI畫面改回跟apple手機大小一樣。

--

--

Jameskrauser Lee
Jameskrauser Lee

Written by Jameskrauser Lee

For the last few years. i was involved mostly in the development of Automatic Fare collection system for the Chennai Metro. Familiar with C++ and iOS.

No responses yet