Last updated at 2018/11/27

记第一次发布App到AppStore
iOS Swift开发什么的,基础知识基本上掌握的差不多了,就打算弄一个小项目玩一玩。因为寒假和朋友一起去韩国的时候打了德州扑克,然后很蛋疼的用了纸来记分,每次都要算啊算的,打算就做一个以德州扑克为原型的计分器来练练手了。正好这个项目又和UITableView十分相关(也就是iOS中的表格视图,见下图),就这么着手了。


写多了Web前端,联想到根据一个DataSource来输出多项数据,自然是想到我们的循环了:
<?php foreach($dataSource as $data): ?>
<div>$data->content</div>
<?php endforeach; ?>


但是在iOS中,现在的教程都让我们用Interface Builder来做界面,怎么可能还用循环输出数据呢?在iOS编程中,这个问题的答案是UITableViewDelegate。

iOS的MVC架构与Web中略有不同。
在Web开发中,View要想与后端沟通,必须靠刷新界面提交数据,或者使用AJAX异步加载。
在iOS中,每个View都会有一个Delegate(代理),当这个视图上发生了操作的时候,视图会触发Delegate的一个函数。视图本身并不知道谁是Delegate,也不知道这个Delegate函数具体会实现什么内容,但是它在执行特定操作的时候,就会告诉Delegate:啊,现在我在做这个了。
比如UITextField(文字输入框),当用户完成输入的时候,它就会触发一个 TextFieldWillReturn的函数。具体这个函数会实现什么,我可以在我的Delegate中实现。比如我可以在我的控制器中:
class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet textField: UITextField!    //这是我的输入框
 
    override func viewDidLoad(){
        super.viewDidLoad()
        textField.delegate = self    //设置输入框的Delegate为当前控制器
    }

    func textFieldWillReturn(....) {
        //Do Something Here
    }
}


UITableView的控制方法也是靠Delegation,只不过iOS中有一个特定的控制器,已经为UITableView优化,并且实现了UITableViewDelegate。它就是UITableViewController。如果我们需要用一个dataSource来输出表格,我们只需要在Interface Builder中设定UITableView的形式为Dynamic Prototype,然后在特定的UITableViewController中实现这几个函数: numberOfSections, numberOfCells, cellForRowAt。根据函数名就可以知道,它们分别是定义表格的Section数量,每个Section的row数量,和在某个Section,某个Row的表格项的样式。实现了这几个函数,我们就可以从一个dataSource,可以是数组啊,对象啊,中输出表格了。

另外一个学到的是UserDefaults和NSData的用法。UserDefaults是iOS中应用可以明文存放数据的地方。我在计分器中,存数据的方式就是把一个个Game(我自己创建的类,里面包含一个玩家字典,游戏轮数组) 的对象存入UserDefaults。具体方法是将这个Game的对象转化为NSData,然后存入。这就需要在Game类上继承NSObject,并实现NSCoding。

至于上传AppStore的部分,其实相当简单。看网上的教程很麻烦,还要生成Certificate什么的各种乱七八糟的东西。其实Xcode就可以帮我们完成上传。只要在Build那里选择Generic iOS Device,选择Product -> Archive,就可以获得"Upload to App Store"的选项。事先,你需要在Developer Panel中填写一个新的Bundle ID,并在iTunes Connect中创建这个App。

这些做完了,填写信息,提交审核。我的应用只用了一天半就通过审核了,很开心。

第一次发布应用,心情还是非常兴奋的。iOS开发确实充满了魅力,配合Swift和Xcode,无论是语言还是环境,都无可挑剔。