小而美的Swift&iOS教程02-BasicList

BasicList.gif

這個(gè)教程涉及以下內(nèi)容


  • Array(數(shù)組)基礎(chǔ)
  • 通過 DataSource(數(shù)據(jù)源)顯示tableView內(nèi)容
  • 通過 Delegate(委托)使tableView可以響應(yīng)用戶操作
  • 使用storyboard的segue實(shí)現(xiàn)基本的頁面跳轉(zhuǎn)及界面間傳值
  • 字符串的截取

UITableView


教程實(shí)現(xiàn)的這種類似的滾動(dòng)表格的界面所有智能手機(jī)的用戶應(yīng)該都會(huì)很熟悉,微信的聊天界面,淘寶的寶貝列表都是這種結(jié)構(gòu)。這是App最常用的一種控件之一。

UITableView有兩個(gè)重要接口,dataSource和delegate
  • dataSource,數(shù)據(jù)源,顧名思義,它定義了列表的每個(gè)cell顯示什么樣數(shù)據(jù)信息。(靜態(tài))
  • delegate,委托,定義了列表如何與用戶交互。(動(dòng)態(tài))
讓UITableView顯示內(nèi)容

tableView中的內(nèi)容不實(shí)憑空顯示出來的,絕大多數(shù)情況下,我們列表的信息是通過數(shù)組(Array)這種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的,通過如下代碼定義并初始化一個(gè)數(shù)組,里面存儲(chǔ)了我們要顯示的各種各樣的動(dòng)物。

var animalList = ["??   dog", "??   cat", "??   frog", "??   panda", "??   snake",
                  "??   monkey", "??   fox", "??   bee", "??   shark", "??   puffer",
                  "??   dolphin", "??   lizard", "??   gorilla", "??   horse", "??   pig",
                  "??   cow", "??   squirrel", "??   cheetah", "??   whale", "??   rhinoceros"]

將tabelView拖入stroyboard并設(shè)置為全屏顯示,并在ViewController中實(shí)現(xiàn)datasource接口方法

extension ViewController: UITableViewDataSource {
  //定義了每個(gè)cell的顯示方式,每次從數(shù)組中取出
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "animal cell", for: indexPath)
        cell.textLabel?.text = animalList[indexPath.row]
        return cell
    }
    //定義了列表每個(gè)section有多少行
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return animalList.count
    }
    //定義了列表有多少區(qū)(section)
    func numberOfSections(in tableView: UITableView) -> Int {
         return 1
     }
}
讓UITableView響應(yīng)用戶點(diǎn)擊
extension ViewController: UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        tableView.deselectRow(at: indexPath, animated: true)
        animalList.insert(animalList.remove(at: indexPath.row), at: 0)
        animalsTableView.moveRow(at: indexPath, to: [0,0])
    }
}

這時(shí)每次被點(diǎn)擊的行就會(huì)移到列表的頂部,同時(shí)數(shù)組也做相應(yīng)的更新。

Segue實(shí)現(xiàn)頁面跳轉(zhuǎn)并傳值

首先在storyboard中通過拖拽新建一個(gè)ViewController命名,并新建一個(gè)swift文件與ViewController進(jìn)行連接,類名設(shè)置為DetailViewController。
在新的DetailViewController中拖入兩個(gè)Label,調(diào)整大小并用StackView包裹后居中。

DetailViewController.png

并將label與代碼建立連接:

class DetailViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    var fullTitle: String? //用來接收segue傳過來的字符串
    @IBOutlet weak var emojiTextView: UILabel!
    @IBOutlet weak var nameTextView: UILabel!
}

然后在兩個(gè)Controller之間拖拽新建Segue,將Segue的Identifier設(shè)置為"show detail"

在ViewController中設(shè)置prepare()方法傳值

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let indexPath = sender as! IndexPath
        if segue.identifier == "show detail"{
            let vc = segue.destination as! DetailViewController
            print(animalList[(indexPath.row)])
            vc.fullTitle = animalList[(indexPath.row)]
           //注意
            // 此處不可以直接對(duì) label.text 字符屬性進(jìn)行操作,因?yàn)榇藭r(shí) label 為 nil
            // vc.emojiTextView.text = animalList[(indexPath.row)] 會(huì)導(dǎo)致 crash
      }  
    }

并在DetailViewController中的viewDidLoad中對(duì)字符串進(jìn)行處理并設(shè)置對(duì)應(yīng)的Label顯示指定內(nèi)容

 override func viewDidLoad() {
        super.viewDidLoad()
        //分割字符串,從首字符到指定字符
        emojiTextView.text = fullTitle?.substring(to: (fullTitle?.index((fullTitle?.startIndex)!, offsetBy: 1))!)
        //分割字符串從制定字符到尾字符
        nameTextView.text = fullTitle?.substring(from: (fullTitle?.index((fullTitle?.startIndex)!, offsetBy: 4))!)
        self.navigationItem.title = nameTextView.text
    }

這樣這個(gè)簡(jiǎn)單的動(dòng)物列表就完成啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,752評(píng)論 1 14
  • 代碼創(chuàng)建UIWindow對(duì)象 Xcode7之后使用代碼創(chuàng)建UIWindow對(duì)象: //創(chuàng)建UIWindow對(duì)象 s...
    云之君兮鵬閱讀 1,504評(píng)論 0 2
  • 空帷寂寂續(xù)瑤箏, 紙墨無章書未成。 情題紅葉入清渠, 心系黃耳至錦城。 其二 隔座取杯觥籌筵, 盡此良宵任清歡。 ...
    花間娘子閱讀 535評(píng)論 0 0
  • 第二十三頁 第二十三頁一片空白,只身空白之中,看不到下一頁也翻不過上一頁,也在這一頁中找不到任何出口似乎到處都是出...
    井暖沐閱讀 10,268評(píng)論 0 1
  • 其中的內(nèi)容呢,可以簡(jiǎn)單概括。就是用盲人的角度逛成都景點(diǎn)。嗯嗯,是的,就是這樣簡(jiǎn)潔明了。 個(gè)人認(rèn)為內(nèi)容不重要,重要的...
    涼涼噠閱讀 358評(píng)論 1 2

友情鏈接更多精彩內(nèi)容