Showing posts with label iOS. Show all posts
Showing posts with label iOS. Show all posts

(Tutorial iOS) Add Load More in UITableView

Monday, August 27, 2018 Add Comment
Hello guys, pada kesempatan sebelumnya saya sudah menjelaskan tentang bagaimana membuat custom tableview di ios. Bisa dilihat di sini https://wimsonevel.blogspot.com/2017/07/tutorial-ios-custom-uitableviewcell-in.html.

Tutorial kali ini saya akan akan menjelaskan bagaimana menambahkan load more di tableview atau bisa disebut paging. Mekanismenya ketika kita men-drag scroll sampai ke bawah, pada saat itu lakukan request untuk memuat data.

Oke langsung saja.

Pertama kita perlu menambahkan sebuah View yang bernama UIActivityIndicatorView dibagian footer dari UITabelView. Akan muncul loading indicator ketika tableview di drag atau scroll ke bawah. Buat extension dari UITableView dengan beberapa fungsi yaitu showLoadingFooter, hideLoadingFooter dan isLoadingFooterShowing.

import Foundation
import UIKit
// MARK: Loading Footer extension UITableView { func showLoadingFooter(){ let loadingFooter = UIActivityIndicatorView(activityIndicatorStyle: .gray) loadingFooter.frame.size.height = 60 loadingFooter.hidesWhenStopped = true loadingFooter.startAnimating() tableFooterView = loadingFooter } func hideLoadingFooter(){ let tableContentSufficentlyTall = (contentSize.height > frame.size.height) let atBottomOfTable = (contentOffset.y >= contentSize.height - frame.size.height) if atBottomOfTable && tableContentSufficentlyTall { UIView.animate(withDuration: 0.2, animations: { self.contentOffset.y = self.contentOffset.y - 60 }, completion: { finished in self.tableFooterView = UIView() }) } else { self.tableFooterView = UIView() } } func isLoadingFooterShowing() -> Bool { return tableFooterView is UIActivityIndicatorView } }
Kemudian kita perlu mengimplementasikan function scrollViewDidEndDragging di ViewController.

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if scrollView == tableView {
            if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) {
                if !tableView.isLoadingFooterShowing() {
                    loadData()
                }
            }
        }
    }


Buat method loadData(), kemudian tampilkan loading indicator di tableview footer diikuti dengan reload data atau dari request data.

func loadData() {
        // do network request here
        
        self.tableView.showLoadingFooter()
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            
            self.foods.append(contentsOf: self.moreFoods)
            self.tableView.reloadData()
            
            self.tableView.hideLoadingFooter()
        }
    }

Kode lengkapnya :

import UIKit

class ViewController: UITableViewController {

    var foods = [Food(thumb: "rendang", name: "Rendang", country: "Indonesia"),
                 Food(thumb: "nasi_goreng", name: "Nasi Goreng", country: "Indonesia"),
                 Food(thumb: "sushi", name: "Sushi", country: "Japan"),
                 Food(thumb: "tom_yum_goong", name: "Tom Yum Goong", country: "Thailand"),
                 Food(thumb: "pad_thai", name: "Pad Thai", country: "Thailand"),
                 Food(thumb: "som_tam", name: "Som Tam", country: "Thailand"),
                 Food(thumb: "dim_sum", name: "Dim Sum", country: "Hongkong"),
                 Food(thumb: "ramen", name: "Ramen", country: "Japan"),
                 Food(thumb: "peking_duck", name: "Peking Duck", country: "China"),
                 Food(thumb: "massaman_curry", name: "Massaman Curry", country: "Thailand")]
    
    var moreFoods: [Food] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.moreFoods.append(contentsOf: self.foods)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func loadData() {
        // do network request here
        
        self.tableView.showLoadingFooter()
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            
            self.foods.append(contentsOf: self.moreFoods)
            self.tableView.reloadData()
            
            self.tableView.hideLoadingFooter()
        }
    }

}

struct Food {
    
    var thumb = String()
    var name = String()
    var country = String()
    
}

class CustomCell: UITableViewCell {
    
    @IBOutlet weak var thumbImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var countryLabel: UILabel!
    
}

extension ViewController {
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return foods.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let food = foods[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        
        cell.thumbImageView.image = UIImage(named: food.thumb)
        
        cell.nameLabel?.text = food.name
        cell.countryLabel.text = food.country
        
        return cell
    }
    
    override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if scrollView == tableView {
            if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) {
                if !tableView.isLoadingFooterShowing() {
                    loadData()
                }
            }
        }
    }
}


Build dan jalankan maka hasilnya seperti dibawah ini.


Source lengkap dapat dilihat di https://github.com/wimsonevel/Paging-UITableView

Sekian tutorial singkat kali ini.
Jangan lupa share ke social media kalian ^^.

(Tutorial iOS) Pull to Refresh with UIRefreshControl

Monday, August 20, 2018 1 Comment

Hello guys, pada kesempatan sebelumnya saya sudah menjelaskan tentang bagaimana membuat custom tableview di ios. Bisa dilihat di sini https://wimsonevel.blogspot.com/2017/07/tutorial-ios-custom-uitableviewcell-in.html.

Tutorial kali ini pada dasarnya meneruskan tutorial yang sebelumnya yakni dengan menambahkan Pull to Refresh. Untuk membuat pull to refresh di iOS dapat menggunakan widget yang dinamakan UIRefreshControl. Implementasinya cukup sederhana yaitu dengan menempakannya ke dalam table view yang kita buat.

Oke, langsung aja ke TKP.

Pertama, deklarasikan variabel UIRefreshControl berikut.

let pullRefresh = UIRefreshControl()

Buat function untuk menghandle refresh control. Di sini lah tempat menghandle network request. Untuk sementara saya menggunakan thread biasa.

func pullRefresh(_ refreshControl: UIRefreshControl) {
    // do network request here
        
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        self.tableView.reloadData()
        refreshControl.endRefreshing()
    }
}

Lalu atur properties-nya (warna, text, dll) sesuai keinginan.

// Refresh Control Properties
pullRefresh.addTarget(self, action: #selector(ViewController.pullRefresh(_:)), for: UIControlEvents.valueChanged)
        
pullRefresh.tintColor = UIColor.red
pullRefresh.attributedTitle = NSAttributedString(string: "Please wait ...")

Kemudian tambakan ke dalam tableview sebagai subview.

// Add to Table View
if #available(iOS 10.0, *) {
    tableView.refreshControl = pullRefresh
} else {
    tableView.addSubview(pullRefresh)
}

Berikut source code lengkapnya :

import UIKit

class ViewController: UITableViewController {

    
    var foods = [Food(thumb: "rendang", name: "Rendang", country: "Indonesia"),
                 Food(thumb: "nasi_goreng", name: "Nasi Goreng", country: "Indonesia"),
                 Food(thumb: "sushi", name: "Sushi", country: "Japan"),
                 Food(thumb: "tom_yum_goong", name: "Tom Yum Goong", country: "Thailand"),
                 Food(thumb: "pad_thai", name: "Pad Thai", country: "Thailand"),
                 Food(thumb: "som_tam", name: "Som Tam", country: "Thailand"),
                 Food(thumb: "dim_sum", name: "Dim Sum", country: "Hongkong"),
                 Food(thumb: "ramen", name: "Ramen", country: "Japan"),
                 Food(thumb: "peking_duck", name: "Peking Duck", country: "China"),
                 Food(thumb: "massaman_curry", name: "Massaman Curry", country: "Thailand")]
    
    let pullRefresh = UIRefreshControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // Refresh Control Properties
        pullRefresh.addTarget(self, action: #selector(ViewController.pullRefresh(_:)), for: UIControlEvents.valueChanged)
        
        pullRefresh.tintColor = UIColor.red
        pullRefresh.attributedTitle = NSAttributedString(string: "Please wait ...")
        
        // Add to Table View
        if #available(iOS 10.0, *) {
            tableView.refreshControl = pullRefresh
        } else {
            tableView.addSubview(pullRefresh)
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func pullRefresh(_ refreshControl: UIRefreshControl) {
        // do network request here
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.tableView.reloadData()
            refreshControl.endRefreshing()
        }
    }

}

struct Food {
    var thumb = String()
    var name = String()
    var country = String()
}

class CustomCell: UITableViewCell {
    
    @IBOutlet weak var thumbImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var countryLabel: UILabel!
    
}

extension ViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return foods.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let food = foods[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        
        cell.thumbImageView.image = UIImage(named: food.thumb)
        
        cell.nameLabel?.text = food.name
        cell.countryLabel.text = food.country
        
        return cell
        
    }

}


Build dan run, maka hasilnya sebagai berikut :


Source code lengkap dapat dilihat di https://github.com/wimsonevel/PullToRefresh

Sekian tutorial singkat kali ini, semoga bermanfaat.
Jangan lupa share ke social media kalian ya ^^

(Tutorial iOS) Custom UITableViewCell in UITableView

Thursday, July 27, 2017 Add Comment

Hallo gaes, sudah lama rasanya tidak menulis tutorial tentang iOS.
Nah pada kesempatan kali ini saya akan coba membahas tentang UITableView. UITableView merupakan widget yang biasa digunakan untuk menampilkan data dalam bentuk list. Pada umumnya komponen di dalam UITableView disebut dengan UITableViewCell. Komponen UITableViewCell inilah yang mengisi setiap baris-baris di dalam list. Secara default, UITabelViewCell cuma berisi title dan subtitle. Maka dari itu jika ingin membuat baris yang lebih komplek maka kita perlu membuat custom UITableViewCell.

Oke singkat penjelasannya di atas, sekarang langsung kita praktekkan aja.

Pertama buat project baru di Xcode, untuk bahasa pemrogramannya menggunakan Swift 3.


Kemudian pada halaman storyboard-nya kita menggunakan Table View Controller. Drag and drop Table View Controller ke halaman storyboard, lalu jadikan sebagai Root View Controller (alias tanda panah berada di Table View Controller).



Setelah itu tambahkan beberapa widget di dalam Table View Cell, contohnya di sini kita menambahkan Image View dan Label. Lalu letakkan dengan posisi sebagai berikut :


Embed Table View Controller tadi ke dalam Navigation Controller dengan cara klik menu EditorEmbed inNavigation Controller





Sekarang kita masuk ke sesi codingnya. Buka file ViewController.swift kemudian implement UITableViewController seperti berikut :

import UIKit

class ViewController: UITableViewController {

    var foods = [Food(thumb: "rendang", name: "Rendang", country: "Indonesia"),
                 Food(thumb: "nasi_goreng", name: "Nasi Goreng", country: "Indonesia"),
                 Food(thumb: "sushi", name: "Sushi", country: "Japan"),
                 Food(thumb: "tom_yum_goong", name: "Tom Yum Goong", country: "Thailand"),
                 Food(thumb: "pad_thai", name: "Pad Thai", country: "Thailand"),
                 Food(thumb: "som_tam", name: "Som Tam", country: "Thailand"),
                 Food(thumb: "dim_sum", name: "Dim Sum", country: "Hongkong"),
                 Food(thumb: "ramen", name: "Ramen", country: "Japan"),
                 Food(thumb: "peking_duck", name: "Peking Duck", country: "China"),
                 Food(thumb: "massaman_curry", name: "Massaman Curry", country: "Thailand")]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

Tambahkan type struct untuk item Food.

struct Food {
    var thumb = String()
    var name = String()
    var country = String()
}

Tambahkan class CustomCell.

class CustomCell: UITableViewCell {

    @IBOutlet weak var thumbImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var countryLabel: UILabel!
    
}

Kemudian reference komponen dari Table View Cell di storyboard ke kelas CustomCell di atas.



Tambahkan extension di bawahnya kemudian override beberapa function dari TableView.

extension ViewController {
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return foods.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let food = foods[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        
        cell.thumbImageView.image = UIImage(named: food.thumb)
        
        cell.nameLabel?.text = food.name
        cell.countryLabel.text = food.country
        
        return cell

    }
    
}

Source code lengkapnya jadi sebagai berikut :

import UIKit

class ViewController: UITableViewController {

    var foods = [Food(thumb: "rendang", name: "Rendang", country: "Indonesia"),
                 Food(thumb: "nasi_goreng", name: "Nasi Goreng", country: "Indonesia"),
                 Food(thumb: "sushi", name: "Sushi", country: "Japan"),
                 Food(thumb: "tom_yum_goong", name: "Tom Yum Goong", country: "Thailand"),
                 Food(thumb: "pad_thai", name: "Pad Thai", country: "Thailand"),
                 Food(thumb: "som_tam", name: "Som Tam", country: "Thailand"),
                 Food(thumb: "dim_sum", name: "Dim Sum", country: "Hongkong"),
                 Food(thumb: "ramen", name: "Ramen", country: "Japan"),
                 Food(thumb: "peking_duck", name: "Peking Duck", country: "China"),
                 Food(thumb: "massaman_curry", name: "Massaman Curry", country: "Thailand")]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

struct Food {
    var thumb = String()
    var name = String()
    var country = String()
}

class CustomCell: UITableViewCell {

    @IBOutlet weak var thumbImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var countryLabel: UILabel!
    
}

extension ViewController {
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return foods.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let food = foods[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        
        cell.thumbImageView.image = UIImage(named: food.thumb)
        
        cell.nameLabel?.text = food.name
        cell.countryLabel.text = food.country
        
        return cell

    }
    
}


Build dan jalankan maka hasilnya seperti ini :


Source code lengkap dapat dilihat di https://github.com/wimsonevel/CustomUITableViewCell

Sekian tutorial dari saya dan semoga bermanfaat.
Jangan lupa share ke sosial media kalian. Thanks :)

(Tutorial iOS) Sidebar Menu with SWRevealViewController in Swift

Sunday, August 07, 2016 Add Comment

SWRevealViewController merupakan sebuah UIViewController yang dapat digunakan untuk membuat menu samping (sidebar menu) di iOS. Side View bisa diletakkan di kiri maupun di kanan. Jadi, SWRevealViewController ini mirip dengan Sidebar menu pada aplikasi Facebook.


Contohnya seperti ini :


Sidebar sendiri secara default sebenarnya tidak ada di iOS. Namun, kita bisa membuat atau mengcustom sendiri sidebar menu dengan bantuan library SWRevealViewController.

Pada postingan kali ini saya mau membahas bagaimana cara membuat Sidebar Navigation Menu di iOS.

Sebelumnya kita harus mendownload dulu SWRevealViewController library di sini https://github.com/John-Lluch/SWRevealViewController 

Hanya ada 2 buah file yang kita butuhkan yakni :
- SWRevealViewController.h 
- SWRevealViewController.m 

Kemudian buat project baru di XCODE, lalu masukkan import kedua file SWRevealViewController.h dan SWRevealViewController.m ke folder SideBar.



Pada saat diimport biasanya akan muncul alert untuk menambahkan Bridging Header.

Apa itu Bridging Header? Bridging Header berfungsi sebagai penghubung atau jembatan komunikasi antara Objective-C ke Swift. Jadi, kita dapat memanggil kelas Objective-C ke dalam kelas Swift.

Download icon-icon (menu, home, profile, notifications, star dan settings) yang dibutuhkan dan bisa dicari di : https://design.google.com/icons/
Kemudian taruh di assets/Images.

File Bridging Header nantinya akan otomatis di tambahkan. Untuk mengecek apakah sudah terpasang atau belum bisa dilihat di tab Build Settings di project.


Selanjutnya mendesain Storyboard sebagai berikut :


*Sorry gan screenshotnya terpotong di bagian bawah alias gak muat.

Pada Main.Storyboard terdiri dari :
1. RevealViewController
2. SideMenuController
3. HomeViewController
4. ProfileViewController
5. NotificationsViewController
6. FavoritesViewController
7. SettingsViewController

Pada desain Storyboard di atas kita harus menambahkan Custom UIViewController dengan SWRevealViewController.


Setting dan tambahkan 2 custom segue yang satunya ke UIViewController untuk Home (sw_front).



Dan yang kedua untuk SideMenuController. Masing-masing di setting class SWRevealViewControllerSegueSetController.



Kemudian dari SideMenuController hubungkan masing-masing ke HomeViewController, ProfileViewController, NotificationsViewController, FavoritesViewController dan SettingsViewController dengan custom segue.


Lalu di set class SWRevealViewControllerSeguePushController.


Berikutnya adalah membuat menu di SideMenuController. Desain layoutnya dengan UITableView sebagai berikut :

Setelah layoutnya selesai, buat kelas-kelas Swift.

Pertama, buat kelas SideMenuController.swift, di kelas ini lah kita akan mengatur menunya.
import Foundation
import UIKit

class SideMenuController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    
    let arrayTitle = ["Home", "Profile", "Notifications", "Favorites", "Settings"]
    let arrayIcon = ["ic_home_36pt", "ic_person_36pt", "ic_notifications_36pt", "ic_star_36pt", "ic_settings_36pt"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.tableView.dataSource = self
        self.tableView.delegate = self
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrayTitle.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let cell: SideBarCell = tableView.dequeueReusableCellWithIdentifier("SideBarCell") as! SideBarCell
        
        cell.title.text = arrayTitle[indexPath.row]
        cell.icon.image = UIImage(named: arrayIcon[indexPath.row])
        
        return cell
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
        switch (indexPath.row) {
        case 0:
            self.performSegueWithIdentifier("home_segue", sender: self)
            break
        case 1:
            self.performSegueWithIdentifier("profile_segue", sender: self)
            break
        case 2:
            self.performSegueWithIdentifier("notifications_segue", sender: self)
            break
        case 3:
            self.performSegueWithIdentifier("favorites_segue", sender: self)
            break
        case 4:
            self.performSegueWithIdentifier("settings_segue", sender: self)
            break
        default:
            break
        }
    }

}
SideBarCell.swift
import Foundation

class SideBarCell: UITableViewCell {
    
    @IBOutlet weak var icon: UIImageView!
    @IBOutlet weak var title: UILabel!
    
}
HomeViewController.swift
import Foundation

class HomeViewController: UIViewController {
    
    @IBOutlet weak var menuBar: UIBarButtonItem!
    
    override func viewDidLoad() {
        setMenuBarBtn(menuBar)
    }
    
    func setMenuBarBtn(menuBar: UIBarButtonItem) {
        menuBar.target = revealViewController()
        menuBar.action = #selector(SWRevealViewController.revealToggle(_:))
        view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}
ProfileViewController.swift
import Foundation

class ProfileViewController: UIViewController {
    
    @IBOutlet weak var menuBar: UIBarButtonItem!
    
    override func viewDidLoad() {
        setMenuBarBtn(menuBar)
    }
    
    func setMenuBarBtn(menuBar: UIBarButtonItem) {
        menuBar.target = revealViewController()
        menuBar.action = #selector(SWRevealViewController.revealToggle(_:))
        view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}
NotificationsViewController.swift
import Foundation

class NotificationsViewController: UIViewController {
    
    @IBOutlet weak var menuBar: UIBarButtonItem!
    
    override func viewDidLoad() {
        setMenuBarBtn(menuBar)
    }
    
    func setMenuBarBtn(menuBar: UIBarButtonItem) {
        menuBar.target = revealViewController()
        menuBar.action = #selector(SWRevealViewController.revealToggle(_:))
        view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}
FavoritesViewController.swift
import Foundation

class FavoritesViewController: UIViewController {
    
    @IBOutlet weak var menuBar: UIBarButtonItem!
    
    override func viewDidLoad() {
        setMenuBarBtn(menuBar)
    }
    
    func setMenuBarBtn(menuBar: UIBarButtonItem) {
        menuBar.target = revealViewController()
        menuBar.action = #selector(SWRevealViewController.revealToggle(_:))
        view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}
SettingsViewController.swift
import Foundation

class SettingsViewController: UIViewController {
    
    @IBOutlet weak var menuBar: UIBarButtonItem!
    
    override func viewDidLoad() {
        setMenuBarBtn(menuBar)
    }
    
    func setMenuBarBtn(menuBar: UIBarButtonItem) {
        menuBar.target = revealViewController()
        menuBar.action = #selector(SWRevealViewController.revealToggle(_:))
        view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}
Selesai, sekarang tinggal build dan running maka hasilnya seperti berikut :


Source Code lengkap bisa dilihat di sini https://github.com/wimsonevel/SidebarMenu-Swift

Ok, Sekian tutorial kali ini dan semoga bermanfaat
Happy Coding ^^

(Tutorial iOS) Tab Menu with Tab Bar Controller

Saturday, July 30, 2016 Add Comment

Membuat menu Tab pada apps iOS kita dapat menggunakan Tab Bar Controller. Beberapa view controller dapat direlasikan ke Tab Bar Controller. Beberapa contoh apps yang menggunakan menu tab.


Berbeda dengan Android, posisi Tab di iOS berada di bagian bawah layar.

Pada postingan kali ini saya akan membahas bagaimana membuat Tab dengan Tab Bar Controller.

Buat project baru di Xcode, kemudian buka Main.storyboard. Desain storyboard nantinya akan seperti ini.


Pada storyboard terdiri dari Tab Bar Controller dan 4 buah View Controller yang memiliki relasi dengan Tab Bar Controller.

Drag & drop Tab Bar Controller, lalu letakkan di storyboard.


Lalu tambahkan 4 View Controller di storyboard. Control drag dari Tab Bar Controller lalu pilih Relationship Segue untuk merelasikan.


Pada View Controller pertama, kita jadikan sebagai Home.



Untuk menambahkan icon & mengedit title dapat diatur di Attributes Inspector.


Lakukan hal yang sama pada 3 buah View Controller lainnya.

Setelah selesai, coba build dan jalankan maka hasilnya seperti berikut :



Custom Tab Bar

Kita dapat meng-custom tab seperti warna background tab dan tint icon. Buka file AppDelegate dan tambahkan kode berikut di dalam method application:

AppDelegate.swift
….

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
    
        UITabBar.appearance().tintColor = UIColor(red: 244/255, green: 67/255, blue:54/255, alpha: 1.0)
        UITabBar.appearance().barTintColor = UIColor.blackColor()
        return true
    }

….
Build dan jalankan lagi maka hasilnya seperti berikut :


Source code dapat dilihat di https://github.com/wimsonevel/TabBar-iOS

Sekian tutorial kali ini, semoga bermanfaat.
Terima Kasih !

Happy Coding :)

More Reference : https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/UIKitUICatalog/UITabBar.html

(Tutorial iOS) Working with UITableView iOS

Monday, May 09, 2016 Add Comment

Salah satu komponen UI yang penting di iOS Apps dikenal dengan UITableView. Dengan UITableView, kita dapat menampilkan dalam bentuk list dari data set sederhana. Selain list sederhana, kita juga dapat mengkostum bukan hanya text saja melainkan dengan gambar atau yang lainnya. Pada tutorial kali ini saya akan menjelaskan bagaimana menampilkan list berupa text saja di dalam UITableView.

Untuk lebih jelasnya simak tutorial sederhana berikut :

Kita mulai dari Main.storyboard, buat sebuah ViewController untuk menampilkan list berikut ini.


Kemudian embed Navigation Controller lalu letakkan komponen Table View dan Table View Cell di dalamnya.



Atur atribut dari Table View Cell seperti dibawah ini. Di sini kita menggunakan style Basic (Text Saja)


Buat View Controller satu lagi untuk menampilkan detail dari list item dengan tampilan berikut ini.


Hubungkan kedua ViewController dengan segue.


Oke selanjutnya kita masuk ke coding.

Buka ViewController.h, sebelumnya kita harus meng-instance TableView dari storyboard terlebih dahulu.



Pada DetailController juga sama, instance label-label yang ada di storyboard.


Selanjutnya New File-> Cocoa Touch Class, dengan nama Item
Item.h
#import <Foundation/Foundation.h>

@interface Item : NSObject

@property (nonatomic, copy) NSString* itemId;
@property (nonatomic, copy) NSString* itemName;

+ (void) setItemId: (NSString*) itemId;
+ (void) setItemName: (NSString*) itemName;

@end

Item.m
#import "Item.h"

@implementation Item

+ (void) setItemId:(NSString *)itemId {
    self.itemId = itemId;
}

+ (void) setItemName:(NSString *)itemName {
    self.itemName = itemName;
}

@end

Buka kelas ViewController.h lalu implement UITableViewDataSource dan UITableViewDelegate.
#import <UIKit/UIKit.h>
#import "Item.h"
#import "DetailController.h"

@interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

Kemudian kita masuk ke ViewController.m, disini kita mengimplementasi beberapa method dari TableView diantaranya :
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 0;
}

Method ini untuk mengembalikan size atau length dari list data.
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Identifier"];
   
    return cell;
}

Method ini untuk mengakses cell-cell dari table view per index.
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
}

Method ini biasanya digunakan untuk berpindah ke ViewController lainnya. Karena tadi kita telah menambahkan segue maka untuk berpindah ke screen selanjutnya menggunakan method ini.

Berikut Source Code lengkapnya :
ViewController.m
#import "ViewController.h"

@implementation ViewController

NSString* const ITEM_CELL_ID = @"ITEM_CELL";
NSString* const ITEM_DETAIL_ID = @"ITEM_DETAIL";

NSMutableArray* itemList;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    [self initMenu];
    
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    [self.tableView reloadData];
}


- (void) initMenu {
    itemList = [[NSMutableArray alloc] init];
    for (int i = 1; i <= 5; i++) {
        Item* item = [[Item alloc] init];
        [item setItemId:[NSString stringWithFormat:@"%i", i]];
        [item setItemName:[NSString stringWithFormat:@"%@%i", @"Item ", i]];
        
        [itemList addObject:item];
    }

}

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [itemList count];
}

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:ITEM_CELL_ID];
    
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ITEM_CELL_ID];
    }
    
    Item *item = [itemList objectAtIndex:indexPath.row];
    
    cell.textLabel.text = [item itemName];
    
    return cell;
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:ITEM_DETAIL_ID]) {
        NSIndexPath* index = [self.tableView indexPathForSelectedRow];
        Item *item = [itemList objectAtIndex:index.row];
        
        DetailController* destView = segue.destinationViewController;
        destView.item = item;
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

DetailController.h
#import <UIKit/UIKit.h>
#import "Item.h"

@interface DetailController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *txtItemId;
@property (weak, nonatomic) IBOutlet UILabel *txtItemName;

@property Item *item;

@end


DetailController.m
#import "DetailController.h"

@interface DetailController ()

@end

@implementation DetailController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    if(self.item != nil){
        [self.txtItemId setText:[NSString stringWithFormat:@"%@%@", @"ID : ", self.item.itemId]];
        [self.txtItemName setText:[NSString stringWithFormat:@"%@%@", @"NAME : ", self.item.itemName]];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

Terakhir jalankan, maka hasilnya sepeti berikut :




Selesai juga…. Huffttt

Semoga agan pembaca sekalian tidak bingung dengan penjelasan saya *Yang nulis aja bingung :v

Source Lengkap bisa dilihat di https://github.com/wimsonevel/iOS-UITableView
*star/fork/follow ya :)

Sekian dan Semoga bermanfaat
Happy Coding :)