Hi Devin,
A great place to start is
http://web.cecs.pdx.edu/~cpinera/javascriptcore-integration-with-clojurescript-in-ios.html
(some slight modifications are required to get that blog post examples working
with the latest, but it's not that hard).
Another great resource is the WWDC 2013 video on JavaScriptCore.
Once you have a sample project up and running, then you are “cooking with
fire.” Roughly the workflow involves editing ClojureScript (I use Cursive in
IntelliJ, but any IDE would do) where the results of lein cljsbuild auto are
being consumed in a “sibling” Xcode workspace. Make a change to ClojureScript,
rebuild your Xcode app, observe the change in behavior, repeat.
Debugging is nearly impossible, so I rely heavily on logging, and on producing
lots of pure functions that can be independently verified in a REPL. So the
first thing you would want to do is set up things do that when you call a
logging function in your ClojureScript, it is routed to iOS and logged in the
console.
To avoid needing to add lots of new JSExport methods for new functionality, I
take the approach of writing some plumbing code that can work with the UI by
referencing UIComponents via their “tag” integer, which I manually set in IB
and then call a “bind!” function in ClojureScript to set up the needed
interactions.
For example, I might have a (def text-field (atom {})) and then in an init
method marked ^:export that takes a view argument, I do (bind! text-field view
1), where the literal 1 is the tag for a text field in IB. I've written bind to
call into Objective C and register for notifications on that tag, setting
things so that, for example, whenever the text changes, it calls back into
ClojureScript executing a function that ends up calling (swap! text-view assoc
:text updated-text).
You can take a similar approach to have button tap events drop a message into a
core.async channel, and associated plumbing to bind a UI button to the channel.
The end result is that you can essentially write what would normally be view
controller code in ClojureScript.
A lot of the above (especially the code fragments) are from memory—ask if you'd
like more elaboration. But in the end, it's simpler and less elaborate than you
might initially think.
- Mike
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.