Advertisement
  1. Code
  2. iOS

iOS dari awal dengan Swift: navigasi controller dan View Controller hierarki

Scroll to top
Read Time: 20 min
This post is part of a series called iOS From Scratch With Swift.
iOS From Scratch With Swift: Table View Basics
iOS From Scratch With Swift: Exploring Tab Bar Controllers

() translation by (you can also view the original English article)

Pada iOS, pengontrol navigasi adalah salah satu alat-alat utama untuk menyajikan beberapa layar konten. Artikel ini mengajarkan Anda bagaimana menggunakan kontroler navigasi dengan menciptakan sebuah aplikasi untuk browsing buku-buku dari perpustakaan.

Pengenalan

Dalam tutorial sebelumnya, Anda belajar UIKit di meja Lihat kelas besar untuk menyajikan data tabel atau kolumnar. Ketika konten perlu tersebar di beberapa layar, meskipun, pengontrol navigasi ini sering merupakan alat pilihan. UINavigationController kelas mengimplementasikan jenis fungsi ini.

Seperti subclass UIViewController lain, pengontrol navigasi mengelola pandangan, instance kelas UIView. Tampilan controller navigasi mengelola beberapa subviews, termasuk bar navigasi di bagian atas, pemandangan yang mengandung konten kustom, dan pilihan toolbar di bagian bawah. Apa yang membuat kontroler navigasi istimewa adalah bahwa hal itu menciptakan dan mengelola hirarki Lihat controller, sering disebut sebagai tumpukan navigasi.

Dalam artikel ini, kami menciptakan aplikasi iOS baru untuk menjadi akrab dengan kelas UINavigationController. Anda akan belajar bahwa kombinasi pengontrol navigasi dan tumpukan (tabel) Lihat controller adalah solusi elegan dan kuat untuk menyajikan nested set data.

Selain UINavigationController, Anda juga akan menemukan UITableViewController dalam tutorial ini, lain subclass UIViewController. UITableViewController mengelola sebuah instance UITableView bukan sebuah instance UIView. Table view controller otomatis mengadopsi protokol UITableViewDataSource dan UITableViewDelegate dan itu akan menghemat beberapa waktu.

Proyek lain

Kami juga akan membuat aplikasi bernama Perpustakaan. Dengan aplikasi ini, pengguna dapat melihat isi daftar penulis dan buku-buku yang mereka menulis. Daftar penulis disajikan dalam tampilan tabel.

Jika pengguna keran nama penulis, daftar buku-buku yang ditulis oleh penulis yang menjiwai ke tampilan. Demikian pula, ketika pengguna memilih judul dari daftar buku, pandangan lain menjiwai ke tampilan, menampilkan gambar cover buku. Mari kita membuat sebuah proyek Xcode baru untuk mendapatkan kita mulai.

Membuat proyek

Buka Xcode, membuat proyek baru dengan memilih New > proyek... dari Berkas menu, dan pilih aplikasi pemandangan tunggal template dari daftar iOS > aplikasi template.

Choosing the Project TemplateChoosing the Project TemplateChoosing the Project Template

Nama proyek perpustakaan dan menetapkan nama organisasi dan pengenal. Menetapkan bahasa ke Swift dan perangkat untuk iPhone. Memberitahu Xcode mana Anda ingin menyimpan proyek dan klik buat.

Configuring the ProjectConfiguring the ProjectConfiguring the Project

Satu aplikasi Lihat template berisi kelas delegasi aplikasi, AppDelegate, storyboard, Main.storyboard, dan sebuah subclass UIViewController, ViewController. Buka AppDelegate.swift dan lihatlah pelaksanaan application(_:didFinishLaunchingWithOptions:). Pelaksanaannya singkat dan harus akrab dengan sekarang.

1
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
2
    return true
3
}

Menambahkan sumber daya

Source file tutorial ini termasuk data yang kami akan menggunakan. Anda dapat menemukannya di folder bernama sumber daya. Ini mencakup daftar properti, Books.plist, yang berisi informasi tentang penulis, buku-buku yang mereka menulis, beberapa informasi tentang setiap buku, dan gambar untuk setiap buku yang termasuk dalam daftar properti.

Tarik folder sumber daya ke proyek Anda untuk menambahkannya ke proyek. Xcode akan menunjukkan beberapa pilihan bila Anda menambahkan folder ke proyek. Pastikan untuk memeriksa kotak centang salinan item jika diperlukan dan jangan lupa untuk menambahkan file ke target Perpustakaan.

Add Resources to ProjectAdd Resources to ProjectAdd Resources to Project
Copy Items Into Destination Folder of GroupCopy Items Into Destination Folder of GroupCopy Items Into Destination Folder of Group

Daftar properti

Sebelum melanjutkan, saya ingin mengambil waktu untuk berbicara tentang daftar properti dan apa yang mereka. Daftar properti adalah tidak lebih dari representasi grafik objek. Seperti yang kita lihat sebelumnya dalam seri ini, grafik objek adalah sekelompok objek, membentuk sebuah jaringan melalui koneksi atau referensi mereka berbagi dengan satu sama lain.

Sangat mudah untuk membaca dan menulis properti daftar dari dan ke disk, yang membuat mereka ideal untuk menyimpan data dalam jumlah kecil. Ketika bekerja dengan daftar properti, hal ini juga penting untuk diingat bahwa hanya jenis tertentu data dapat disimpan dalam daftar properti, seperti string, angka, tanggal, array, Kamus, dan data biner.

Xcode membuat browsing daftar properti sangat mudah. Pilih Books.plist dari folder sumber daya Anda ditambahkan ke proyek dan menelusuri isinya menggunakan Xcode's built-in properti daftar editor. Ini akan menjadi alat yang berguna nanti dalam artikel ini ketika kita mulai bekerja dengan isi Books.plist.

Browsing a Property List in XcodeBrowsing a Property List in XcodeBrowsing a Property List in Xcode

Subclassing UITableViewController

Sebelum kita dapat mulai menggunakan data yang disimpan dalam Books.plist, pertama kita perlu meletakkan beberapa dasar. Ini termasuk menciptakan tampilan controller yang mengelola tampilan tabel dan yang akan menampilkan para penulis yang tercantum dalam daftar properti.

Dalam artikel sebelumnya, kami menciptakan sebuah subclass UIViewController dan menambahkan tampilan tabel ke tampilan Lihat controller untuk menyajikan data ke pengguna. Dalam tutorial ini, kita mengambil jalan pintas dengan subclassing UITableViewController.

Mulai dengan menghapus ViewController.swift dari proyek Anda. Membuat kelas baru dengan memilih New > File... dari Berkas menu. Pilih template kakao Touch kelas dalam daftar iOS > sumber template.

Create a New Cocoa Touch ClassCreate a New Cocoa Touch ClassCreate a New Cocoa Touch Class

Nama kelas baru AuthorsViewController dan membuat sebuah subclass dari UITableViewController. Tidak perlu untuk memeriksa kotak centang juga membuat file XIB untuk antarmuka pengguna, karena kita akan menggunakan storyboard untuk membuat aplikasi antarmuka pengguna.

Configure the New Cocoa Touch ClassConfigure the New Cocoa Touch ClassConfigure the New Cocoa Touch Class

Buka Main.storyboard untuk menggantikan tampilan controller di storyboard dengan meja Lihat controller. Pilih tampilan controller di storyboard, menekan tombol delete, dan seret sebuah instance UITableViewController dari Object Library di sebelah kanan. Pilih melihat baru controller, buka Inspektur identitas di sebelah kanan, dan mengatur kelas AuthorsViewController.

Adding a Table View ControllerAdding a Table View ControllerAdding a Table View Controller

Dalam artikel sebelumnya, kami membuat menggunakan sel prototipe untuk mengisi tampilan tabel. Dalam tutorial ini, saya akan menunjukkan kepada Anda pendekatan alternatif. Pilih objek Lihat tabel di ruang kerja atau dari daftar obyek disebelah kiri, buka Inspektur atribut di sebelah kanan, dan mengatur sel-sel prototipe ke 0.

Remove Prototype CellsRemove Prototype CellsRemove Prototype Cells

Storyboard setiap kebutuhan controller lihat awal. Ini adalah tampilan controller yang dibuat ketika storyboard dimuat. Kita dapat menandai controller pandangan penulis sebagai lihat awal oleh penulis View Controller objek di sebelah kiri, buka Inspektur atribut di sebelah kanan, dan memeriksa checkbox awal View Controller.

Mempopulasikan tampilan tabel

Buka AuthorsViewController.swift dan memeriksa file dari isinya. Karena AuthorsViewController sebuah subclass dari UITableViewController, AuthorsViewController sudah sesuai dengan protokol UITableViewDataSource dan UITableViewDelegate.

Sebelum kita dapat menampilkan data dalam tampilan tabel, kita membutuhkan data untuk ditampilkan. Seperti yang saya sebutkan sebelumnya, data yang terdapat dalam Books.plist berfungsi sebagai sumber data tampilan tabel. Untuk menggunakan data ini, kita pertama perlu beban itu ke dalam suatu objek, array harus tepat.

Kami menyatakan penulis variabel properti dan set nilai awal array kosong jenis [AnyObject]. Ingat bahwa jenis AnyObject yang dapat mewakili setiap kelas atau struktur.

Lihat controller viewDidLoad() metode adalah tempat yang baik untuk memuat data dari Books.plist ke controller pandangan penulis properti. Kita melakukan ini dengan menerapkan initializer init(contentsOfFile:) NSArray kelas. Kami melemparkan objek yang dihasilkan contoh jenis [AnyObject].

1
authors = NSArray(contentsOfFile: path) as! [AnyObject]

Metode menerima path file, yang berarti bahwa kita perlu untuk mengetahui apa file path Books.plist. File, Books.plist, terletak di bundel aplikasi, yang merupakan sebuah kata mewah untuk direktori yang berisi executable aplikasi dan aplikasi sumber daya, seperti gambar dan suara.

Untuk mendapatkan path file dari Books.plist, kita pertama perlu referensi ke aplikasi utama bundel dengan menelepon mainBundle() pada kelas NSBundle. Langkah berikutnya adalah untuk meminta aplikasi bundle jalan salah satu sumber daya, Books.plist. Kita memanggil pathForResource(_:ofType:) pada aplikasi utama bundel, lewat di nama dan jenis (ekstensi) file kami tertarik. Kami menyimpan file path dalam filePath konstan.

1
let filePath = NSBundle.mainBundle().pathForResource("Books", ofType: "plist")

Karena mungkin bahwa kami meminta untuk sumber daya yang tidak hadir dalam bundel aplikasi pathForResource(_:ofType:) kembali opsional. Sebagai aturan umum, jika metode dapat kembali nil, opsional harus digunakan. Konstan filePath adalah jenis String? Aman membuka opsional, kami membuat penggunaan mengikat opsional, yang kita diskusikan sebelumnya dalam seri ini.

Jika kita menempatkan dua potong bersama-sama, kita berakhir dengan pelaksanaan berikut viewDidLoad(). Saya juga menambahkan pernyataan cetak untuk mencetak isi dari penulis properti untuk konsol. Hal ini memungkinkan kita melihat isinya.

1
override func viewDidLoad() {
2
    super.viewDidLoad()
3
    
4
    let filePath = NSBundle.mainBundle().pathForResource("Books", ofType: "plist")
5
    
6
    if let path = filePath {
7
        authors = NSArray(contentsOfFile: path) as! [AnyObject]
8
        print(authors)
9
    }
10
}

Jika Anda sudah membaca artikel sebelumnya dari seri ini, kemudian mengisi tampilan tabel harus langsung. Karena tampilan tabel berisi hanya satu bagian, pelaksanaan numberOfSectionsInTableView(_:) sangatlah mudah. AuthorsViewController mewarisi dari UITableViewController, yang sudah sesuai dan mengimplementasikan protokol UITableViewDataSource. Itu sebabnya kita perlu menggunakan kata kunci yang menimpa. Kita override metode yang dilaksanakan oleh kelas induk.

1
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
2
    return 1
3
}

Jumlah baris dalam hanya bagian dari tampilan tabel sama dengan nomor penulis dalam array penulis sehingga semua yang perlu kita lakukan adalah jumlah item array itu.

1
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
2
    return authors.count
3
}

Pelaksanaan tableView(_:cellForRowAtIndexPath:) serupa dengan yang kita lihat dalam artikel sebelumnya. Perbedaan utama adalah bagaimana kita mengambil data yang kami menampilkan di sel Lihat tabel.

Sejumlah penulis berisi daftar ordered kamus, dengan setiap kamus yang mengandung dua pasangan key-value. Objek untuk kunci bernama penulis adalah jenis String, sedangkan objek untuk kunci buku adalah array Kamus dengan kamus masing-masing mewakili sebuah buku yang ditulis oleh penulis. Buka Books.plist di Xcode untuk memeriksa struktur sumber data jika ini tidak sepenuhnya jelas.

Sebelum kita menerapkan tableView(_:cellForRowAtIndexPath:), kita perlu untuk mengurus dua hal. Pertama, kami menyatakan konstan untuk pengenal kembali sel kita akan menggunakan.

1
import UIKit
2
3
class AuthorsViewController: UITableViewController {
4
5
    let CellIdentifier = "Cell Identifier"
6
    
7
    var authors = [AnyObject]()
8
    
9
    ...
10
11
}

Kedua, kita memanggil registerClass(_:forCellReuseIdentifier:) pada tampilan tabel, melewati dalam UITableViewCell.classForCoder() dan kembali sel pengenal. Kita memanggil metode ini dalam viewDidLoad() untuk memastikan itu disebut hanya sekali.

1
override func viewDidLoad() {
2
    super.viewDidLoad()
3
    
4
    let filePath = NSBundle.mainBundle().pathForResource("Books", ofType: "plist")
5
    
6
    if let path = filePath {
7
        authors = NSArray(contentsOfFile: path) as! [AnyObject]
8
        print(authors)
9
    }
10
    
11
    tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: CellIdentifier)
12
}

Dengan di atas di tempat, pelaksanaan tableView(_:cellForRowAtIndexPath:) menjadi cukup pendek.

1
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
2
    // Dequeue Resuable Cell

3
    let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier, forIndexPath: indexPath)
4
    
5
    if let author = authors[indexPath.row] as? [String: AnyObject], let name = author["Author"] as? String {
6
        // Configure Cell

7
        cell.textLabel?.text = name
8
    }
9
    
10
    return cell;
11
}

Perhatikan bahwa kita rantai opsional binding dengan tanda koma. Ini adalah pendekatan yang nyaman untuk menghindari bersarang jika pernyataan. Kami meminta penulis untuk elemen indexPath.row dan kenalannya sebagai [String: AnyObject]. Karena kita membutuhkan nama penulis, kami meminta penulis untuk nilai untuk kunci "Penulis", downcasting hasil ke String.

Menambahkan kontroler navigasi

Menambahkan kontroler navigasi mudah menggunakan storyboard. Namun, sebelum kita menambahkan kontroler navigasi, penting untuk memahami bagaimana pengontrol navigasi bekerja pada iOS.

Seperti subclass UIViewController lain, pengontrol navigasi mengelola sebuah instance UIView. Tampilan controller navigasi mengelola beberapa subviews, termasuk bar navigasi di bagian atas, pemandangan yang mengandung konten kustom, dan pilihan toolbar di bagian bawah. Apa yang membuat kontroler navigasi yang unik adalah bahwa itu berhasil tumpukan Lihat controller.

Navigation StackNavigation StackNavigation Stack

Susunan istilah hampir dapat diambil secara harfiah. Ketika pengontrol navigasi diinisialisasi, pengontrol navigasi diberikan akar Lihat controller. Akar Lihat controller adalah controller lihat di bagian bawah tumpukan navigasi.

Dengan mendorong lain lihat controller ke tumpukan navigasi, tampilan controller Lihat akar diganti pandangan baru Lihat controller. Ketika bekerja dengan navigasi controller, tampilan terlihat adalah selalu tampilan controller pemandangan paling atas tumpukan navigasi.

Ketika tampilan controller dihapus atau muncul dari tumpukan navigasi, tampilan controller Lihat bawahnya menjadi terlihat lagi. Dengan mendorong dan muncul tampilan controller ke dan dari tumpukan navigasi pengontrol navigasi, tampilan hierarki dibuat dan, sebagai akibatnya, sebuah nested set data dapat dipresentasikan kepada pengguna. Mari kita lihat bagaimana semua ini mendorong dan bermunculan bekerja dalam praktek.

Meninjau kembali proyek storyboard (Main.storyboard) dan pilih Lihat controller. Untuk menambahkan kontroler navigasi ke dalam campuran, pilih Embed di > pengontrol navigasi dari Editor menu. Mengubah beberapa hal:

  • pengontrol navigasi menjadi storyboard lihat awal controller
  • adegan baru bernama navigasi Controller adegan ditambahkan
  • bar navigasi ditambahkan ke navigasi dan penulis melihat controller
  • pengontrol navigasi dan penulis view controller yang dihubungkan oleh segue
Adding a Navigation ControllerAdding a Navigation ControllerAdding a Navigation Controller

Segues umum di storyboard dan kita akan belajar lebih banyak tentang mereka nanti dalam seri ini. Ada berbagai macam dari segues dan segue menghubungkan pengontrol navigasi dan penulis Lihat controller segue hubungan.

Setiap navigasi controller memiliki akar Lihat controller, controller lihat di bagian bawah tumpukan navigasi. Itu tidak muncul dari tumpukan navigasi, karena pengontrol navigasi selalu membutuhkan tampilan controller untuk menunjukkan kepada pengguna. Hubungan Suci segue antara pengontrol navigasi dan penulis Lihat controller melambangkan bahwa yang terakhir adalah akar Lihat controller dari controller navigasi.

Bar navigasi di bagian atas navigasi controller dan pandangan penulis controller adalah sesuatu yang Anda dapatkan gratis ketika bekerja dengan navigasi controller. Ini adalah instance dari UINavigationBar dan membantu menavigasi navigasi stack.

Meskipun pengontrol navigasi controller lihat awal dari storyboard, penulis Lihat controller adalah controller pandangan pertama kita akan melihat ketika meluncurkan aplikasi. Seperti yang saya sebutkan sebelumnya, pengontrol navigasi adalah tidak lebih dari pembungkus yang membantu menavigasi antara hirarki Lihat controller. Pemandangan ini dihuni oleh pemandangan pemandangan controller dalam tumpukan navigasi yang.

Untuk menambahkan judul untuk bar navigasi, tambahkan baris berikut ke metode viewDidLoad() kelas AuthorsViewController.

1
// Set Title

2
title = "Authors"

Setiap tampilan controller memiliki properti judul yang digunakan di berbagai tempat. Bar navigasi adalah salah satu dari mereka. Jalankan aplikasi untuk melihat hasil dari perubahan kecil.

Mendorong dan muncul

Mari kita sekarang menambahkan kemampuan untuk melihat daftar buku-buku ketika pengguna keran nama penulis. Ini berarti bahwa kita perlu untuk menangkap seleksi (nama penulis) instantiate melihat baru controller berdasarkan pilihan itu, dan mendorong melihat baru controller ke tumpukan navigasi. Apakah ini terdengar rumit? Hal ini tidak. Mari saya tunjukkan.

Lain meja View Controller

Mengapa tidak menampilkan daftar buku dalam tampilan tabel lain. Menciptakan subclass baru dari UITableViewController dan nama itu BooksViewController.

Create the BooksViewController ClassCreate the BooksViewController ClassCreate the BooksViewController Class

Memuat daftar buku mudah seperti yang kita lihat sebelumnya, tapi bagaimana buku Lihat controller tahu apa penulis pengguna mengetuk? Ada beberapa cara untuk memberitahu controller pandangan baru tentang pilihan pengguna, namun pendekatan yang Apple merekomendasikan dikenal sebagai melewati oleh referensi. Bagaimana cara kerjanya?

Buku Lihat controller menyatakan properti penulis yang kita dapat mengatur untuk mengkonfigurasi buku Lihat controller. Buku Lihat controller menggunakan properti author untuk menunjukkan buku-buku penulis dipilih. Buka BooksViewController.swift dan menambah properti variabel jenis [String: AnyObject]! dan nama itu penulis.

1
import UIKit
2
3
class BooksViewController: UIViewController {
4
5
    var author: [String: AnyObject]!
6
    
7
    ...
8
    
9
}

Mengapa kami tidak menyatakan penulis sebagai [String: AnyObject]? atau [String: AnyObject]? Karena variabel perlu memiliki nilai awal, kami tidak menyatakan penulis sebagai [String: AnyObject]. Kita dapat menggunakan [String: AnyObject]?, tapi itu berarti kita harus membuka opsional setiap kali kita ingin mengakses nilainya.

Di Swift, Anda umumnya akan menggunakan optionals membuka paksa jika Anda tahu properti memiliki nilai dan, lebih penting lagi, jika perlu untuk memiliki nilai untuk aplikasi Anda untuk bekerja sebagai diharapkan. Jika properti author tidak memiliki nilai, maka buku Lihat controller adalah kurang bermanfaat bagi kita karena itu tidak akan mampu menunjukkan data.

Untuk membuatnya lebih mudah untuk mengakses buku-buku dari penulis, kami juga menyatakan properti yang dihitung. Sesuai namanya, sebuah properti dihitung tidak menyimpan nilai. Itu mendefinisikan sebuah getter dan/atau setter untuk mendapatkan dan menetapkan nilai properti lain. Lihatlah properti dihitung buku di bawah ini.

1
var books: [AnyObject] {
2
    get {
3
        if let books = author["Books"] as? [AnyObject] {
4
            return books
5
        } else {
6
            return [AnyObject]()
7
        }
8
    }
9
}

Nilai buku tergantung pada nilai penulis. Kami memeriksa apakah penulis memiliki nilai untuk kunci "Buku" dan kenalannya nilai ke array AnyObject objek. Jika penulis tidak memiliki nilai untuk "Buku" kita menciptakan array kosong jenis [AnyObject]. Karena buku dihitung properti hanya mendefinisikan getter, kita dapat menyederhanakan implementasi seperti ini:

1
var books: [AnyObject] {
2
    if let books = author["Books"] as? [AnyObject] {
3
        return books
4
    } else {
5
        return [AnyObject]()
6
    }
7
}

Sisanya kelas BooksViewController mudah. Lihatlah implementasi protokol UITableViewDataSource tiga metode yang ditunjukkan di bawah ini.

1
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
2
    return 1
3
}
4
5
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
6
    return books.count
7
}
8
9
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
10
    // Dequeue Resuable Cell

11
    let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier, forIndexPath: indexPath)
12
    
13
    if let book = books[indexPath.row] as? [String: String], let title = book["Title"] {
14
        // Configure Cell

15
        cell.textLabel?.text = title
16
    }
17
    
18
    return cell;
19
}

Ini juga berarti bahwa kita perlu mendeklarasikan properti konstan untuk pengenal kembali sel dan mendaftarkan kelas untuk digunakan kembali sel di viewDidLoad(). Ini bukan sesuatu yang baru.

1
import UIKit
2
3
class BooksViewController: UITableViewController {
4
5
    let CellIdentifier = "Cell Identifier"
6
    
7
    ...
8
    
9
}
1
override func viewDidLoad() {
2
    super.viewDidLoad()
3
    
4
    tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: CellIdentifier)
5
}

Mendorong View Controller

Ketika pengguna keran nama penulis di controller pandangan penulis, aplikasi harus menunjukkan daftar buku yang ditulis oleh penulis. Ini berarti bahwa kita perlu untuk instantiate sebuah instance dari kelas BooksViewController, memberitahu contoh apa penulis dipilih oleh pengguna, dan mendorong melihat baru controller ke tumpukan navigasi.

Storyboard akan membantu kita dengan hal ini. Buka Main.storyboard, menyeret UITableViewController contoh lain dari Object Library, dan mengatur kelasnya untuk BooksViewController di Inspektur identitas.

Add Books View Controller to StoryboardAdd Books View Controller to StoryboardAdd Books View Controller to Storyboard

Pilih tampilan tabel di melihat baru controller dan atur jumlah sel-sel prototipe untuk 0 di Inspektur atribut. Untuk mendorong buku Lihat controller ke tumpukan navigasi pengontrol navigasi, kita perlu membuat segue lain. Saat ini, namun, kami membuat segue manual, acara Suci segue harus tepat.

Pilih penulis Lihat controller di storyboard, tahan tombol Control, dan tarik dari controller pandangan penulis untuk buku Lihat controller. Pilih Manual Suci Segue > Tampilkan dari menu yang muncul untuk membuat segue dari controller pandangan penulis buku Lihat controller.

Create a Manual Show SegueCreate a Manual Show SegueCreate a Manual Show Segue

Ada satu hal lagi yang perlu kita lakukan sebelum kembali ke pelaksanaan buku Lihat controller. Pilih segue yang kita buat, buka Inspektur atribut di sebelah kanan, dan mengatur pengenal segue ke BooksViewController. Dengan memberikan segue nama, kita dapat merujuk ke kemudian dalam kode.

Setting the Segue IdentifierSetting the Segue IdentifierSetting the Segue Identifier

Untuk menempatkan segue untuk menggunakan, kita perlu untuk mengimplementasikan tableView(_:didSelectRowAtIndexPath:) di penulis Lihat controller. Metode ini didefinisikan dalam protokol UITableViewDelegate seperti yang kita lihat dalam artikel sebelumnya tentang tabel dilihat. Dalam metode ini, kita memanggil performSegueWithIdentifier(_:sender:) untuk melakukan segue yang kami ciptakan dalam storyboard. Metode performSegueWithIdentifier(_:sender:) mengambil dua argumen, pengenal segue dan pengirim pesan. Sekarang harus jelas mengapa kita memberikan segue pengenal di storyboard? Perhatikan juga bahwa kami reset pemilihan setelah melakukan segue.

1
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
2
    // Perform Segue

3
    performSegueWithIdentifier(SegueBooksViewController, sender: self)
4
    
5
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
6
}

SegueBooksViewController konstan adalah lain konstan properti kelas AuthorsViewController.

1
import UIKit
2
3
class AuthorsViewController: UITableViewController {
4
5
    let CellIdentifier = "Cell Identifier"
6
    let SegueBooksViewController = "BooksViewController"
7
    
8
    ...
9
10
}

Sebelum segue dilakukan, lihat controller memiliki kesempatan untuk mempersiapkan segue di prepareForSegue(_:sender:). Dalam metode ini, lihat controller dapat mengkonfigurasi tujuan tampilan controller, buku-buku Lihat controller. Mari kita menerapkan prepareForSegue(_:sender:) untuk melihat bagaimana ini bekerja.

1
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
2
    if segue.identifier == SegueBooksViewController {
3
        if let indexPath = tableView.indexPathForSelectedRow, let author = authors[indexPath.row] as? [String: AnyObject]  {
4
            let destinationViewController = segue.destinationViewController as! BooksViewController
5
            destinationViewController.author = author
6
        }
7
    }
8
}

Metode ini dipanggil setiap kali segue dilakukan. Kami pertama Periksa jika pengenal dari segue sama dengan SegueBooksViewController. Kami kemudian meminta tampilan tabel untuk path indeks pilihan saat ini menggunakan mengikat opsional. Jika baris yang dipilih, kami meminta penulis penulis yang sesuai dengan pilihan ini.

Dalam jika pernyataan, kami mendapatkan referensi ke buku Lihat controller (tujuan tampilan controller segue) dan menetapkan properti penulis penulis sedang dipilih dalam tampilan tabel.

Anda mungkin bertanya-tanya kapan atau di mana kami menginisialisasi buku Lihat controller? Kita tidak secara eksplisit instantiate sebuah instance controller Lihat buku. Storyboard tahu apa kelas itu perlu instantiate dan menginisialisasi instance dari BooksViewController bagi kita.

Sebelum Anda menjalankan aplikasi, buka BooksViewController.swift dan mengatur tampilan controller judul untuk nama penulis untuk memperbarui judul bar navigasi.

1
override func viewDidLoad() {
2
    super.viewDidLoad()
3
    
4
    if let name = author["Author"] as? String {
5
        title = name
6
    }
7
    
8
    tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: CellIdentifier)
9
}

Jalankan aplikasi. Ketuk nama penulis dalam tampilan tabel dan mengamati bagaimana sebuah instance BooksViewController baru didorong ke tumpukan navigasi dan ditampilkan kepada pengguna. Pernahkah Anda memperhatikan bahwa kita juga mendapatkan tombol kembali gratis apabila menggunakan kontroler navigasi. Judul controller lihat sebelumnya digunakan sebagai judul tombol kembali.

Menambahkan Cover buku

Ketika pengguna keran buku di buku Lihat controller, aplikasi harus menunjukkan sampul buku. Kami tidak akan menggunakan kontroler Lihat tabel untuk ini. Sebaliknya, kami menggunakan vanili polos UIViewController subclass dan menampilkan cover buku dalam instance kelas UIImageView. UIImageView adalah UIView subclass mengkhususkan diri dalam menampilkan gambar.

Menciptakan subclass baru dari UIViewController — tidak UITableViewController — dan nama itu BookCoverViewController.

Creating the BookCoverViewController ClassCreating the BookCoverViewController ClassCreating the BookCoverViewController Class

Kita perlu menyatakan dua sifat yang disimpan di melihat baru controller. Properti disimpan pertama adalah referensi ke tampilan gambar yang kita akan menggunakan untuk menampilkan cover buku. Kata kunci @IBOutlet menunjukkan bahwa kami akan membuat sambungan di storyboard. Kedua properti disimpan, buku, adalah jenis [String: String]!. Properti ini merupakan buku yang ditampilkan dalam sampul buku Lihat controller.

1
import UIKit
2
3
class BookCoverViewController: UIViewController {
4
5
    @IBOutlet var bookCoverView: UIImageView!
6
    
7
    var book: [String: String]!
8
    
9
    ...
10
11
}

Buka Main.storyboard untuk membuat antarmuka pengguna buku Lihat controller. Seret sebuah instance UIViewController dari perpustakaan objek ke ruang kerja dan set kelas untuk BookCoverViewController di Inspektur identitas.

Adding a View Controller to the WorkspaceAdding a View Controller to the WorkspaceAdding a View Controller to the Workspace

Seret sebuah instance UIImageView dari perpustakaan objek ke tampilan controller tampilan dan membuatnya menutupi pandangan seluruh tampilan controller. Dalam Inspektur koneksi, terhubung dengan outlet bookCoverView Lihat controller.

Adding an Image ViewAdding an Image ViewAdding an Image View

Untuk memastikan tampilan gambar dengan benar ditampilkan pada setiap perangkat, kita perlu menerapkan tata letak diperlukan kendala seperti ditunjukkan di bawah.

Adding Layout Constraints to the Image ViewAdding Layout Constraints to the Image ViewAdding Layout Constraints to the Image View

Sebelum kita menerapkan Lihat controller, membuat push Suci segue antara buku Lihat controller dan buku sampul Lihat controller. Pilih segue dan mengatur pengenal yang BookCoverViewController di Inspektur atribut.

Creating a Segue to the Book Cover View ControllerCreating a Segue to the Book Cover View ControllerCreating a Segue to the Book Cover View Controller

Di kelas BooksViewController, menyatakan properti pengenal segue konstan.

1
import UIKit
2
3
class BooksViewController: UITableViewController {
4
5
    let CellIdentifier = "Cell Identifier"
6
    let SegueBookCoverViewController = "BookCoverViewController"
7
    
8
    ...
9
10
}

Kami menggunakan properti ini di tableView(_:didSelectRowAtIndexPath:) untuk melakukan segue yang kami ciptakan dalam storyboard. Jangan lupa untuk Hapus baris setelah melakukan segue.

1
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
2
    // Perform Segue

3
    performSegueWithIdentifier(SegueBookCoverViewController, sender: self)
4
    
5
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
6
}

Pelaksanaan prepareForSegue(_:sender:) terlihat sangat mirip dengan kelas BooksViewController. Kami memeriksa apakah segue pengenal sama dengan SegueBookCoverViewController dan meminta tampilan tabel indeks jalan baris yang saat ini dipilih. Kami meminta buku buku yang sesuai dengan pilihan pengguna dan mengatur properti buku tujuan tampilan controller, contoh BookCoverViewController.

1
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
2
    if segue.identifier == SegueBookCoverViewController {
3
        if let indexPath = tableView.indexPathForSelectedRow, let book = books[indexPath.row] as? [String: String]  {
4
            let destinationViewController = segue.destinationViewController as! BookCoverViewController
5
            destinationViewController.book = book
6
        }
7
    }
8
}

Kami mengkonfigurasi tampilan gambar BookCoverViewController Class di metode viewDidLoad(). Kami meminta buku nilai untuk kunci "Penutup" dan instantiate sebuah objek UIImage dengan menerapkan initializer init(named:), melewati dalam nama file. Kami menetapkan objek UIImage untuk gambar milik bookCoverView.

1
override func viewDidLoad() {
2
    super.viewDidLoad()
3
    
4
    if let fileName = book["Cover"] {
5
        bookCoverView.image = UIImage(named: fileName)
6
        bookCoverView.contentMode = .ScaleAspectFit
7
    }
8
}

Di viewDidLoad(), kami juga menetapkan konten modus tampilan gambar untuk ScaleAspectFit. Properti contentMode adalah jenis UIViewContentMode, penghitungan. Nilai kami menetapkan, ScaleAspectFit, memberitahu tampilan gambar untuk meregangkan sebanyak mungkin sementara menghormati dengan rasio aspek gambar.

Jalankan aplikasi dan bawa untuk spin. Sekarang Anda dapat menelusuri buku-buku disimpan dalam Books.plist.

Mana Pop?

Di awal artikel ini, saya menjelaskan bahwa tampilan controller dapat didorong ke dan muncul dari tumpukan navigasi. Sejauh ini, kami hanya mendorong tampilan controller ke tumpukan navigasi. Muncul Lihat controller dari tumpukan navigasi terjadi bila pengguna menyentuh tombol kembali bar navigasi. Ini adalah sedikit lain dari fungsi yang kami dapatkan secara gratis.

Di beberapa titik, namun, Anda akan berjalan ke dalam situasi di mana Anda perlu secara manual pop tampilan controller dari tumpukan navigasi. Anda dapat melakukannya dengan menghubungi popViewControllerAnimated(_:) pada navigasi Lihat controller. Ini menghilangkan controller pemandangan paling atas dari tumpukan navigasi.

Atau, Anda dapat pop semua kontroler pemandangan dari tumpukan navigasi — kecuali akar Lihat controller — dengan memanggil popToRootViewControllerAnimated(_:) pengontrol navigasi.

Bagaimana Anda mengakses controller navigasi controller view? Kelas UIViewController menyatakan sebuah properti dihitung, navigationController, jenis UINavigationController?. Jika tampilan controller setumpuk navigasi, kemudian properti referensi pengontrol navigasi yang milik tumpukan navigasi.

Kesimpulan

Saya harap Anda setuju bahwa navigasi controller tidak yang rumit. Artikel ini bisa menjadi jauh lebih pendek, tetapi saya berharap bahwa Anda telah belajar beberapa hal sepanjang jalan. Dalam artikel berikutnya, kami mengambil melihat tab bar controller. Meskipun tab bar controller juga mengelola Koleksi tampilan controller, mereka sangat berbeda dari navigasi controller.

Jika Anda memiliki pertanyaan atau komentar, Anda dapat meninggalkan mereka di komentar di bawah atau mengulurkan tangan kepada saya di Twitter.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.