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 clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to