作者:星隕
來源:
音視訊開發進階最近在搗鼓 iOS 上的音視訊開發,由于之前并沒有 iOS 開發經驗,直接上手寫代碼的話壓力還是挺大的,是以也趁機看了下 iOS 開發的内容,算是做一些準備工作吧。
iOS 開發語言用的是 Swift ,一些文法和 Kotlin 還是挺像的,上手難道小了很多,而且也實在受不了 OC 的中括号
[]
調用方式,寫不習慣。
在應用開發上,新手入門當然就是學習調用各種控件了。像 Button、Label 這樣的單控件都還比較簡單,看看就會。像 UITableView、UINavigationViewController 這些複合控件就相對複雜了,需要實際練練手才行,包括 XCode、StoryBoard 等工具的使用,也需要有一定的熟練度才好。這也是本篇文章的主要目的了,通過部落格記錄的形式來提高熟練度。
基礎準備工作就先從界面程式設計開始吧,能折騰出一個簡單的應用。至于更深層次的 iOS 應用生命周期、性能優化、圖形圖像那些就等後面碰到了再研究吧。
iOS 應用建立和移除 SceneDelegate
目前使用的 XCode 版本是 12.1 ,建立 iOS 應用預設使用了 SceneDelegate ,這裡用不上它,先把它移除了。

步驟如下:
- 删除 SceneDelegate.swift 檔案
- 在 Info.plist 檔案裡面移除 Application Scene Manifest
- 删除 AppDelegate.Swift 中的 connectingSceneSession 和 didDiscardSceneSessions 方法。
- 在 AppDelegate.swift 中添加 UIWindow 變量。
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
}
UITableView 的使用
從 UITableView 開始搞起。在預設的 Main.storyboard 對應的 ViewController 裡面添加一個 UITableView 類。
然後通過 Auto Layout 将它鋪滿整個應用,這個時候啟動應用的話會顯示黑屏的,因為沒有給它填充資料。
UITableView 通過 UITableViewDataSource 和 UITableViewDelegate 分别來控制它的資料和互動邏輯。
其中 UITableViewDataSource 有如下方法是必現要實作的,指定要展示的資料内容和 TableView 中 Item ,而 UITableViewDelegate 就沒強制要求實作方法了,至于協定中的其他方法都可以檢視具體源碼,有具體的應用場景再使用了。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
<#code#>
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
<#code#>
}
通過
extension
文法來實作以上兩個協定:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuse", for: indexPath)
cell.textLabel?.text = "hello tableview"
return cell
}
這裡要指定 StoryBoard 中的 UITableView 對應單元格的
Identifer
,它代表了 TableView 中單元格的複用辨別,
dequeueReusableCell
方法就是通過這個字元串辨別來複用的。
TableView 的複用邏輯類似于 Android 中的 RecyclerView 了,都是複用移出螢幕外的單元格來節省記憶體的。
最後在 StoryBoard 中将 UITableView 與 ViewController 建立起關聯,并給 UITableView 指定具體協定的實作。
@IBOutlet weak var mTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
mTableView.dataSource = self
mTableView.delegate = self
}
這個時候再啟動應用就能看到 TableView 中充滿内容了。
當然,這裡也省略了很多内容。比如自定義單元格樣式、通過代碼來添加 UITableView 等。
UITableView 跳轉詳情頁和傳回
在實作了 UITableView 的基礎上,繼續開發實作點選某個單元格跳轉到詳情頁并傳回的功能。
在 Main.storyboard 中添加一個 ViewController ,并添加一個 Label,一個 Button,分别展示内容和傳回。
完成詳情頁的展示如下:
接下來要實作 UITableView 到詳情頁的跳轉,通過 Segue 的方式進行連接配接。
Segue 使用
iOS 實作頁面跳轉有多種方式,比如 UINavigationController、UITarBarController 等控制器,或者在 StoryBoard 上進行連線。
Segue 跳轉到詳情頁
連線的方式也比較簡單,滑鼠點選要連接配接的控件,然後按住 Control 鍵拖曳到另一個 ViewController 上,在彈出的 Segue 頁面中選擇跳轉樣式。
這裡面有多種樣式可以選擇:
- Show
- Show Detail
- Present Modialy
- Present As Popover
- Custom
簡單點直接選擇了 Show 就行了,連接配接後的樣子如下:
這時候直接運作程式就能在 TableView 中點選某一項跳轉到詳情頁了,接下來就是要從詳情頁傳回到 TableView 界面。
Segue 實作詳情頁傳回
按照上面的邏輯,在詳情頁的 Back 按鍵上建立 Segue 就會傳回了。但是這樣會建立一個 ViewController 而不是傳回到之前使用的,來回操作點選的話,不斷建立頁面,最終導緻記憶體可能暴漲。
這裡要用到 Unwind Segue 方法了。在 DetailViewController 中添加如下方法:
@IBAction func unwindSegue(segue: UIStoryboardSegue) {
NSLog("Back to Table View Controller!")
}
然後,點選詳情頁的 Back 按鍵,再按住 Control 鍵拖曳到 TableView 對應 ViewController 的 Exit 方法處,會彈出上面寫的 unwindSegue 方法,點選該方法即可建立連接配接。
這時候再運作應用,就能實作 TableView 到詳情頁的跳轉了,點選 Back 按鍵傳回到 TableView 界面,輸出上面的 log 内容,并且不建立新的 ViewController 。
Segue 資料傳遞
當想在 ViewController 之間傳遞資料的話,也可以通過 Segue 進行,它提供了一些方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender API_AVAILABLE(ios(5.0));
通過實作 prepareForSegue 方法達到資料傳輸的目的。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toDetailView" {
let cv = segue.destination as! DetailViewController
cv.str = "data"
}
}
在 Segue 進行跳轉的時候,prepare 方法是必定會執行的,通過實作該方法就能傳遞資料了。
當然,還有其他的一些方法去傳遞資料,這裡就不闡述了。
UINavigationController 使用
使用 UINavigationController 比較簡單,在 Editor 菜單下面的 Embed In 選擇 Navigation Controller ,就自動将 TableView 嵌入到 UINavigationController 裡面去了。
這時再運作程式就能看到效果了,上層多了一個導航欄。
NavigationItem 設定
上層看到的導航欄叫做 NatigationItem ,它有很多屬性可以配置,如下圖所示:
可以設定左右按鍵名稱和事件,可以設定中間的标題,還可以設定上層的提示内容以及背景顔色。
self.navigationItem.prompt = "loading"
self.navigationController?.navigationBar.barTintColor = UIColor.yellow;
// 這裡的 Button 其實是 UIBarButtionItem,要注意類型
let leftItem = UIBarButtonItem(title: "left", style: UIBarButtonItem.Style.done, target: self, action: #selector(leftAction))
let rightItem = UIBarButtonItem(title: "right", style: UIBarButtonItem.Style.done, target: self, action: #selector(rightAction))
self.navigationItem.leftBarButtonItem = leftItem
self.navigationItem.rightBarButtonItem = rightItem
self.navigationItem.title = "NavigationItem"
對應的左右按鍵事件代碼如下:
@objc func leftAction(){
print("click left action")
}
@objc func rightAction(){
print("click right action")
}
這裡隻是簡單地定義了一下樣式,還可以弄得更加複雜花哨一點,比如帶有圖檔的 UIBarButtonItem,自定義的 UIBarButtonItem 等。
注意的是,當在 StoryBoard 中嵌入了 UINavigationController 之後,就可以通過 self.navigationController 來引用它了,如果沒有嵌入,直接引用會 Crash 的。
在詳情頁 DetailViewController 中同樣能夠通過 self.navigationController 來修改 NavigationItem 的樣式。
通過 NavigationController 實作頁面跳轉
除了使用 Segue 之外,還可以使用 NavigationController 來實作頁面跳轉,先把之前添加的 Segue 移除掉。
NavigationController 是一個管理 UIViewController 的容器,以棧的形式進行管理,提供相應的方法如下:
// 将 ViewController 壓入棧中
open func pushViewController(_ viewController: UIViewController, animated: Bool)
// 彈出棧頂的 ViewController
open func popViewController(animated: Bool) -> UIViewController?
// 彈出到指定的 ViewController
open func popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]?
// 彈出除 root ViewController 之外的所有 ViewController
open func popToRootViewController(animated: Bool) -> [UIViewController]?
// 傳回隻讀屬性的棧頂 ViewController
open var topViewController: UIViewController? { get }
// 傳回棧中目前可見的界面對應的 ViewController,也是隻讀屬性
open var visibleViewController: UIViewController? { get }
// 傳回棧中所有的 ViewController
open var viewControllers: [UIViewController]
實作頁面跳轉,要做的就是在 TableView 的 Item 點選事件中将詳情頁的 ViewController 壓入棧中,然後在詳情頁 ViewController 的 Back 事件中進行出棧,把目前 ViewController 彈出棧頂,回到 TableView 界面。
代碼如下,在點選事件中進行初始化 ViewController ,并壓入棧中。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let storyboad = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboad.instantiateViewController(identifier: "detailvc") as! DetailViewController
vc.str = "data"
self.navigationController?.pushViewController(vc, animated: false)
}
在 Back 按鍵的點選事件中進行出棧操作。
@IBAction func back(_ sender: Any) {
self.navigationController?.popViewController(animated: true)
}
此時再運作代碼,同樣也能實作頁面跳轉,并且還傳遞了資料過去,和使用的 Segue 的效果基本一緻。
小結
通過以上簡單的小例子,就基本算是了解 iOS 開發了。
内容比較淺顯,很多東西還是可以再繼續拓展一下的,比如 TableView 中自定義單元格樣式、通過代碼來加載 NavigationController 等等。不過相信有了上面的基礎,再到實踐中去學習一些新的技巧也會更加快捷了。
其實 iOS 和 Android 還是有不少相似之處的,畢竟都是移動平台上的應用開發,在一些設計思想有相同之處也不奇怪,比如 TableView 的回收之處、螢幕适配的布局限制等等,這也是要求程式員在學習的時候不僅能夠知其然還要知其是以然,學會舉一反三,這樣再換到其他平台上去學習也能夠得心應手,而不是疲于追趕技術。
接下來就是進擊 iOS 音視訊開發啦~~~
标簽: ios「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。