{"id":32323327,"url":"https://github.com/alexcatch/katachi","last_synced_at":"2026-02-20T23:02:12.120Z","repository":{"id":56917819,"uuid":"184901839","full_name":"AlexCatch/Katachi","owner":"AlexCatch","description":"Dynamic form builder for Swift","archived":false,"fork":false,"pushed_at":"2019-05-05T18:11:36.000Z","size":169,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-23T12:54:23.187Z","etag":null,"topics":["dynamic-forms","forms","forms-builder","ios","swift"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlexCatch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-04T13:58:34.000Z","updated_at":"2019-05-07T21:45:41.000Z","dependencies_parsed_at":"2022-08-21T03:50:57.498Z","dependency_job_id":null,"html_url":"https://github.com/AlexCatch/Katachi","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/AlexCatch/Katachi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexCatch%2FKatachi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexCatch%2FKatachi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexCatch%2FKatachi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexCatch%2FKatachi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlexCatch","download_url":"https://codeload.github.com/AlexCatch/Katachi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexCatch%2FKatachi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29667119,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T19:49:36.704Z","status":"ssl_error","status_checked_at":"2026-02-20T19:44:05.372Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dynamic-forms","forms","forms-builder","ios","swift"],"created_at":"2025-10-23T12:53:59.398Z","updated_at":"2026-02-20T23:02:12.106Z","avatar_url":"https://github.com/AlexCatch.png","language":"Swift","readme":"# 形 Katachi\n![Code example](assets/code-example.png)\n\n## What is it?\nKatachi is a dyanmic form framework for quickly building your own dynamic forms on iOS. It doesn't come with any prebuilt cells but merely acts as the glue and gets things working. I didn't decide to include a set of prebuilt cells as each form is different and has different UI requirements etc.\n\n## Why was it built?\n\nI work at [Langley Foxall](https://langleyfoxall.co.uk), we're a software house who develop great applications for mostly the enterprise market. One of the most common components of our applications is filling out forms, sometimes these forms are dynamically created by end users and sometimes there not, I wanted to make a framework that would lay the foundation for creating these forms while also allowing a high level of customization as each app is different.\n\n## How does it work?\n\nThe magic happens in `KatachiCollectionViewManager`, it handles registering cells \u0026 reusable views with the collection view, determining which cells to dequeue and delegating events in cells to your end view controller. It really is the glue that holds everything together.\n\nReusable views and cells are governed by a set of protocols, you create your classes and implement these protocols to create what you need.\n\n- `IsKatachiSection`\n- `IsKatachiQuestion`\n- `KatachiCollectionViewCell`\n- `KatachiCollectionReusableView`\n\nCreate your classes \u0026 implement the protocols, you can add extra fields to each one (just make sure to cast to your subclass inside your cells.)\n\n`KatachiCollectionViewManager` gathers required information via the following delegate methods which you have to implement inside of your view controller.\n  \n```swift\nfunc registerCells(for collectionView: UICollectionView) -\u003e [KatachiCollectionViewCell.Type]\nfunc registerHeaders(for collectionView: UICollectionView) -\u003e [KatachiCollectionReusableView.Type]\nfunc headerHeight(for section: IsKatachiSection, in collectionView: UICollectionView) -\u003e CGSize\n```\n\nTo register cells \u0026 supplementary views (only headers have been tested at the moment) do something like the following.\n```swift\n  func registerCells(for collectionView: UICollectionView) -\u003e [KatachiCollectionViewCell.Type] {\n      return [\n          KatachiTextCollectionViewCell.self,\n          KatachiPickerCollectionViewCell.self\n      ]\n  }\n\n  func registerHeaders(for collectionView: UICollectionView) -\u003e [KatachiCollectionReusableView.Type] {\n      return [\n          KatachiHeaderCollectionReusableView.self\n      ]\n  }\n```\n\nEvents are delegated to your view controller by `KatachiCollectionViewCellDelegate` \n```swift\npublic protocol KatachiCollectionViewCellDelegate: class {\n    func questionDidChange(question: IsKatachiQuestion!, value: Any?, sender: Any?)\n    func questionActionOccurred(question: IsKatachiQuestion!)\n}\n```\n\nEach cell is passed this delegate so you can fire off these methods when you see fit.\n\nIf you want to have a look at a full base implementation, check out the examples folder.\n\n## Get Started\n**This isn't ready for production.**\n\nIt's lacking tests \u0026 some basic features are missing that you might require (dynamic cell heights, more robust deqeueing of supplementary views etc).\n\nIf you're brave and want to check it out, it's available on Cococpods so install away with by adding the following to your Podfile.\n\n`pod 'Katachi'`\n\nIf you want to give it a test run - run the following command in your terminal.\n\n`pod try Katachi`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexcatch%2Fkatachi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexcatch%2Fkatachi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexcatch%2Fkatachi/lists"}