Giter Club home page Giter Club logo

swiftytoggler's Introduction

SwiftyToggler Banner

Swift 3.1 CocoaPods Compatible Carthage compatible Platform Twitter

Requirements

  • iOS 8.0+
  • Xcode 8.1+
  • Swift 3.1+

Installation

CocoaPods

Create a Podfile file in the root of your application and the following content:

use_frameworks!

target '<Your Target Name>' do
    pod 'SwiftyToggler', '~> 1.0.0'
end

Then, run pod install.

Carthage

Create a Cartfile file in the root of your application and the following content:

github "MarcoSantarossa/SwiftyToggler" ~> 1.0.0

Then, run carthage update to build the framework and drag the built SwiftyToggler.framework into your Xcode project.

Swift Package Manager

Create a Package.swift file in the root of your application and the following content:

import PackageDescription

let package = Package(
  name: "YourApp",
  dependencies: [
    .Package(url: "https://github.com/MarcoSantarossa/SwiftyToggler.git", “1.0.0)
  ]
)

Usage

Create A Feature

There are two ways to create a feature:

Implementing FeatureProtocol

The library provides the protocol FeatureProtocol which you can implement:

class MyProtocol: FeatureProtocol {

	private let parentViewController: UIViewController
	private let featureViewController: UIViewController

	var isEnabled: Bool = false

	init(parentViewController: UIViewController) {
		self.parentViewController = parentViewController
		featureViewController = UIViewController()
	}

	// Main function of Feature. It's called when the future has been run.
	func main() {
		parentViewController.present(featureViewController, animated: true, completion: nil)
	}

	// It's called when the future has been disabled.
	func dispose() {
		featureViewController.dismiss(animated: true, completion: nil)
	}
}

Extending Feature [Recommended]

The library provides the class Feature<T> which you can extend. It has a generic property which is the payload of the feature. The payload is a clean way to manage the dependencies of your feature:

struct MyPayload {
    let parentViewController: UIViewController
}

class MyFeature: Feature<MyPayload> {

	private let featureViewController: UIViewController

	override init(payload: MyPayload?, isEnabled: Bool = false) {
		featureViewController = UIViewController()

		super.init(payload: payload, isEnabled: isEnabled)
	}

    override func main() {
        payload?.parentViewController.present(featureViewController, animated: true, completion: nil)
    }

    override func dispose() {
        featureViewController.dismiss(animated: true, completion: nil)
    }
}

Add A Feature

class ViewController: UIViewController {

	override func viewDidLoad() {
		super.viewDidLoad()

		let featurePayload = MyPayload(parentViewController: self)
		let feature = MyFeature(payload: featurePayload)
		FeaturesManager.shared.add(feature: feature, name: "MyFeature", shouldRunWhenEnabled: true)
	}
}

Remove A Feature

FeaturesManager.shared.remove(featureName: "MyFeature")
// or
FeaturesManager.shared.removeAll()

Run A Feature

do {
	let isRunning = try FeaturesManager.shared.run(featureName: "MyFeature")
	print("Is the feature running: \(isRunning)")
} catch SwiftyTogglerError.featureNotFound {
	print("Feature not found")
} catch {}

Enable/Disable A Feature

do {
	try FeaturesManager.shared.setEnable(true, featureName: "MyFeature")
} catch SwiftyTogglerError.featureNotFound {
	print("Feature not found")
} catch {}

Changes Observer

You can observer when a feature changes the value isEnable:

class ViewController: UIViewController {

	override func viewWillAppear(_ animated: Bool) {
		super.viewWillAppear(animated)

		FeaturesManager.shared.addChangesObserver(self)
	}

	override func viewWillDisappear(_ animated: Bool) {
		super.viewWillDisappear(animated)

		FeaturesManager.shared.removeChangesObserver(self)
	}
}

extension ViewController: FeatureChangesObserver {
	func featureDidChange(name: String, isEnabled: Bool) {

	}
}

Present Features List

Presenting Mode Screenshots

Modal

do {
	try FeaturesManager.shared.presentModalFeaturesList()
} catch SwiftyTogglerError.modalFeaturesListAlreadyPresented {
	print("Features List already presented as modal")
} catch {}

Child View Controller

class ViewController: UIViewController {

	override func viewDidLoad() {
		super.viewDidLoad()

		FeaturesManager.shared.presentFeaturesList(in: self)
	}
}

Advanced

shouldRunWhenEnabled

You can use this flag to run the feature as soon as it's enabled. You can set it with:

FeaturesManager.shared.add(feature: feature, name: "MyFeature", shouldRunWhenEnabled: true)
// or
do {
	try FeaturesManager.shared.update(featureName: "MyFeature", shouldRunWhenEnabled: true)
} catch SwiftyTogglerError.featureNotFound {
	print("Feature not found")
} catch {}

TODO

[ ] Add another example in example project.

[ ] Add feature dependencies.

[ ] Update features list table if a new feature is added when the table is visible.

[ ] Call dispose() when a feature is removed.

[ ] Allow async call to feature main() and dispose().

Communication

  • If you found a bug, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.

Credits

SwiftyToggler is owned and maintained by Marco Santarossa. You can follow him on Twitter at @MarcoSantaDev.

License

SwiftyToggler is released under the MIT license. See LICENSE for details.

swiftytoggler's People

Contributors

marcosantarossa avatar

Watchers

James Cloos avatar Carabineiro avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.