SkillAgentSearch skills...

UITableViewDiffableDataSource

No description available

Install / Use

/learn @YamamotoDesu/UITableViewDiffableDataSource

README

UITableViewDiffableDataSource-Swift

platforms

<table border="0"> <tr> <th>Empty</th> <th>Registration</th> <th>List</th> <th>Info</th> <th>Routing</th> <th>Reviewing</th> </tr> <tr> <td><img src="https://user-images.githubusercontent.com/47273077/128584379-62dd0a99-4eba-408a-9156-5fe0e873fce8.png" height="200" width="100"></td> <td><img src="https://user-images.githubusercontent.com/47273077/127940326-0f0e568b-1777-4068-afa5-201df62a0fbb.png" height="200" width="100"></td> <td><img src="https://user-images.githubusercontent.com/47273077/127940409-dc79c644-cacf-4b87-89dd-7afd21343baa.png" height="200" width="100"></td> <td><img src="https://user-images.githubusercontent.com/47273077/127842062-206fcb6e-ee3e-4a12-8d09-cc1a1ad6321f.png" height="200" width="100"></td> <td><img src="https://user-images.githubusercontent.com/47273077/127842758-f36061b3-6516-490a-af98-3a959b9b8436.png" height="200" width="100"></td> <td><img src="https://user-images.githubusercontent.com/47273077/127842912-58da18de-0ed4-477b-bd22-587c76eb28d2.png" height="200" width="100"></td> </tr> </table>

Context

A diffable data source object is a specialized type of data source that works together with your table view object. It provides the behavior you need to manage updates to your table view’s data and UI in a simple, efficient way.
https://developer.apple.com/documentation/uikit/uitableviewdiffabledatasource

Requirement

  • Xcode Version 12.4 (12D4e)
  • Swift 5
  • iOS 13 and onward
  • Google Font(Nunito Font: https://fonts.google.com/specimen/Nunito)

iPhone Image

<table border="0"> <tr> <tr> <th>Gif image</th> <th>Standard</th> <th>Dark</th> </tr> <td><img src="https://github.com/YamamotoDesu/UITableViewDiffableDataSource-Swift/blob/main/Gif/RocketSim%20Recording%20-%20iPhone%2012%20-%202021-08-02%2018.18.04.gif" width="300"></td> <td><img src="https://user-images.githubusercontent.com/47273077/126889714-397a476a-7154-4023-947b-411e753a5e5d.png" width="300"></td> <td><img src="https://user-images.githubusercontent.com/47273077/126889687-a6773867-d972-41cb-88c3-20463e7e833a.png" width="300"></td> </tr> </table>

iPad Image

<table border="0"> <tr> <tr> <th>Standard</th> <th>Dark</th> </tr> <td><img src="https://user-images.githubusercontent.com/47273077/126889504-a57cef79-78b6-40ac-914c-335af1b73edf.png" width="600"></td> <td><img src="https://user-images.githubusercontent.com/47273077/126889569-7821efaa-9f7f-41bc-aa75-87f074b11fb2.png" width="600"></td> </tr> </table> <table border="0">

Sourcecode

Modern UITable View

To connect a diffable data source to a table view(iOS 13 and onward)


    lazy var dataSource = configureDataSource()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //Assign the diffable data source to your table view.
        tableView.dataSource = dataSource
        
        //Generate the current state of the table data by creating a snapshot
        var snapshot = NSDiffableDataSourceSnapshot<Section, String>()
        snapshot.appendSections([.all])
        snapshot.appendItems(restaurantNames, toSection: .all)
        
        //Call the apply() function of the data source to populate the data
        dataSource.apply(snapshot, animatingDifferences: false)
        
        
    }
    
    func configureDataSource() -> UITableViewDiffableDataSource<Section, String> {
        let cellIdentifier = "favoritecell"
        //Create a UITableViewDiffableDataSource object to connect with your table andprovide the configuration of the table view cells.
        let dataSource = UITableViewDiffableDataSource<Section, String>(
            tableView: tableView,
            cellProvider: { tableView, indexPath, restaurantName in
                let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! RestaurantTableViewCell
                cell.nameLabel.text = restaurantName
                cell.thumbnailImageView.image = UIImage(named: self.restaurantImages[indexPath.row])
                cell.locationLabel.text = self.restaurantLocations[indexPath.row]
                cell.typeLabel.text = self.restaurantTypes[indexPath.row]
                cell.heartMark.isHidden = !self.restaurantIsFavorites[indexPath.row]
                cell.heartMark.tintColor = UITraitCollection.isDarkMode ? .systemYellow : .blue
                return cell
                
            }
        )
        return dataSource
        
    }

Functionality

Routing With MapKit

https://github.com/YamamotoDesu/UITableViewDiffableDataSource-Swift/blob/main/FoodPin/Controller/MapViewController.swift

<table border="0"> <tr> <tr> <th>Locating</th> <th>Routing</th> </tr> <td><img src="https://user-images.githubusercontent.com/47273077/127778176-1ff08ad5-b5fb-4ad2-a837-97e24a551be6.png" width="300"></td> <td><img src="https://user-images.githubusercontent.com/47273077/127778215-fd130ff8-f72a-4565-a9de-94d564b94f99.png" width="300"></td> </tr> </table>

Animation

<table border="0"> <tr> <tr> <th>StandardAnimation</th> <th>SpringAnimation</th> </tr> <td><img src="https://github.com/YamamotoDesu/UITableViewDiffableDataSource-Swift/blob/main/Gif/RocketSim%20Recording%20-%20iPhone%2012%20-%202021-08-02%2012.38.04.gif" width="300"></td> <td><img src="https://github.com/YamamotoDesu/UITableViewDiffableDataSource-Swift/blob/main/Gif/RocketSim%20Recording%20-%20iPhone%2012%20-%202021-08-02%2012.25.37.gif" width="300"></td> </tr> </table>
    override func viewDidLoad() {
        super.viewDidLoad()
        let moveScaleTransform = getScaleAnimation()
        
        // Make the button invisible
        for rateButton in rateButtons {
            rateButton.transform = moveScaleTransform
            rateButton.alpha = 0
        }
    }
    
    func getScaleAnimation() -> CGAffineTransform {
        let moveRightTransform = CGAffineTransform.init(translationX: 600, y: 0)
        let scaleUpTransform = CGAffineTransform.init(scaleX: 5.0, y: 5.0)
        return scaleUpTransform.concatenating(moveRightTransform)
    }
    
    func setSpringAnimation() {
        
        var delay: TimeInterval = 0.1
        for rateButton in self.rateButtons {
            UIView.animate(withDuration: 0.8, delay: delay, usingSpringWithDamping: 0.2,
                           initialSpringVelocity: 0.3, options: [], animations
                            :{
                                rateButton.alpha = 1.0
                                rateButton.transform = .identity
                            }, completion: nil)
            
            delay += 0.1
        }
        UIView.animate(withDuration: 0.4, delay: 0.1, options: [], animations:
                        {
                            self.closeButton.alpha = 1.0
                        }, completion: nil)
    }
    
    func setStandardAnimation() {
        var delay: TimeInterval = 0.1
        for rateButton in self.rateButtons {
            UIView.animate(withDuration: 0.4, delay: delay, options: [], animations:
                            {
                                rateButton.alpha = 1.0
                                rateButton.transform = .identity
                            }, completion: nil)
            
            delay += 0.1
        }
        
        UIView.animate(withDuration: 0.4, delay: 0.1, options: [], animations:
                        {
                            self.closeButton.alpha = 1.0
                        }, completion: nil)

    }

Importing photos with UIImagePickerController

<img src="https://github.com/YamamotoDesu/UITableViewDiffableDataSource-Swift/blob/main/Gif/RocketSim%20Recording%20-%20iPhone%2012%20-%202021-08-03%2009.46.44.gif" width="300">

https://github.com/YamamotoDesu/UITableViewDiffableDataSource-Swift/blob/main/FoodPin/Controller/NewRestaurantController.swift

extension NewRestaurantController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
        if let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            photoImageView.image = selectedImage
            photoImageView.contentMode = .scaleAspectFit
            photoImageView.clipsToBounds = true
        }
        
        dismiss(animated: true, completion: nil)
    }
}

Returns the swipe actions to display on the leading edge of the row(iOS 11 and onward)

<img src="https://user-images.githubusercontent.com/47273077/127734414-c5409c84-54a4-41e7-9ff1-f140e2185d8b.png" width="200">
        
    override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        
        // Get the selected restaurant
        guard let restaurant = self.dataSource.itemIdentifier(for: indexPath) else {
            return UISwipeActionsConfiguration()
        }
        
        // Favorite action
        let favoriteAction = UIContextualAction(style: .normal, title: "") { (action, sourceView, completionHandler) in
            
            let cell = tableView.cellForRow(at: indexPath) as! RestaurantTableViewCell
            cell.heartMark.isHidden = !restaurant.isFavorite
            cell.heartMark.tintColor = UITraitCollection.isDarkMode ? .systemYellow : .blue
            self.restaurantIsFavorites[indexPath.row] = !restaurant.isFavorite
            tableView.rel

Related Skills

View on GitHub
GitHub Stars4
CategoryDevelopment
Updated1y ago
Forks0

Languages

Swift

Security Score

55/100

Audited on Jan 4, 2025

No findings