Posts filed under iOS 8

Swift - Cannot use += operator with String! from UITextField or UITextArea - Implicitly Unwrapped Optional

I'm guessing this is a bug (submitted bug #, but if it isn't, you'll be surprised to learn that in Xcode Version 6.1.1 you cannot append to a String from a UITextView or UITextField.

The problem is that both the UITextField and the UITextView are using an implicitly unwrapped optional String (String!) as the type. This is messing up the +=, so you either have to break apart the statement (defeating the purpose of +=). Or you have do a force unwrap before the +=.

If you don't you'll get a strange Swift Compiler Error stating that 'String!' is not identical to 'UInt8'

var numberString: String! = "0"
numberString = numberString + "2"

numberString! += "1"
numberString += "1" //'String!' is not identical to 'UInt8'

var textView = UITextView()
textView.text += "More text" //'String!' is not identical to 'UInt8'

var textField = UITextField()
textField.text += "Even more text" //'String!' is not identical to 'UInt8'
Posted on December 11, 2014 and filed under iOS 8, swift .

The first beta of the was launched this past week and developers can now start making apps.

There are some limitations, but Apple released a lot more than was expected for WatchKit. There's a lot you'll be able to do within the restrictions, which are related to the embedded hardware (i.e.: Apple Watch) and it's battery life.

For now, until Native Apple Watch support is added sometime next year (fingers crossed), you'll have to work within the provided mechanisms. If something doesn't work, you'll need to let Apple know by submitting to WatchKit or Xcode.

Known Limitations of WatchKit in Xcode 6.2 Beta

  1. Updated: (Beta 2 allows Watch apps to trigger iPhone apps) You cannot press a button on Apple Watch to cause an action in your iPhone app.
  2. You cannot create or use gestures. All gestures are controlled by Apple.
  3. You cannot move objects around screen by CGPoint position (Maybe with tableview hide/show).
  4. You cannot add UI elements at run-time, everything is design time before app runs.
  5. You cannot make fluid 2D/3D games like Flappy birds (Maybe jittery gameplay with image animations + hiding/showing hackery, + borderless button).
  6. Animations are image-based (in Apple's sample they include 360 images to show a full circle progress bar = 2mb image data).
  7. Your code runs on your iPhone app in an extension (new in iOS 8), and your UI + images reside on the Apple Watch.
  8. Your app will stop if the Apple Watch and iPhone are separated beyond the range of bluetooth. Only Apple can run native apps on device.
  9. You can only use storyboard files for UI (no .xib files).
  10. You must create an iPhone app Xcode project and add Apple Watch targets to create an app.
  11. You cannot use a physical iPhone with the Apple Watch simulator. Only available in simulation on Mac.

With some of the limitations in perspective, you can design apps that provide meaningful information that compliment your iPhone app. The watch is intended to show information that can be used quickly, and it isn't designed as a gaming device because of it's limited battery and processing power.

Download and install Xcode 6.2 Beta from the Apple Developer Website

Go to  and you can download the beta versions of Xcode 6.2 and iOS 8.2 for testing out features relating to Apple Watch.

Scroll down to the bottom and read both the and the .

Download .

Getting Started with WatchKit in Xcode 6.2 Beta

In order to bring you up to speed, I've created a short that demonstrates how to create a WatchKit app using timers. There are some bugs, but this is the best place to start if you want to work with some cutting edge technology.

Please submit any bug reports to and you can help Apple improve WatchKit. Duplicate bug requests are a good thing, because it helps Apple see the more common issues.

Download the

Swift WatchKit Tutorial 1 - Get Started with WatchKit to Make apps for the Apple Watch

WatchKit Swift Tutorial 2 - Getting Started with your First WatchKit App in Xcode 6 2 Beta

WatchKit Swift Tutorial 3 - Apple Watch User Interface Explained

WatchKit Swift Tutorial 3 - Apple Watch User Interface Explained WatchKit Course: http://learn.iphonedev.tv/course/make-apps-for-apple-watch Learn how to customize the User Interface (UI) in your first Apple Watch app. There are limitations and you won't use Auto Layout like in a normal app. It's really different with a grid based layout.","source":"

WatchKit Swift Tutorial 3 - Apple Watch User Interface Explained WatchKit Course: http://learn.iphonedev.tv/course/make-apps-for-apple-watch Learn how to customize the User Interface (UI) in your first Apple Watch app. There are limitations and you won't use Auto Layout like in a normal app. It's really different with a grid based layout.

"},"hSize":null,"floatDir":null,"html":"","url":"https://www.youtube.com/watch?v=UOLi-qqvP_c","width":854,"height":480,"providerName":"YouTube","thumbnailUrl":"http://i.ytimg.com/vi/UOLi-qqvP_c/hqdefault.jpg","resolvedBy":"youtube"}" data-block-type="32" id="block-yui_3_17_2_6_1416584323551_46189">

WatchKit Swift Tutorial 4 - Connect the Apple Watch User Interface to Code

WatchKit Swift Tutorial 5 - Setup a NSTimer in Swift with Apple Watch

WatchKit Swift Tutorial 5 - Setup a NSTimer in Swift with Apple Watch WatchKit Course: http://learn.iphonedev.tv/course/make-apps-for-apple-watch The WatchKit SDK is limited. You can't run code on the Apple Watch with the current beta of WatchKit. This should change when Apple finishes the SDK for native apps.","source":"

WatchKit Swift Tutorial 5 - Setup a NSTimer in Swift with Apple Watch WatchKit Course: http://learn.iphonedev.tv/course/make-apps-for-apple-watch The WatchKit SDK is limited. You can't run code on the Apple Watch with the current beta of WatchKit. This should change when Apple finishes the SDK for native apps.

"},"hSize":null,"floatDir":null,"html":"","url":"https://www.youtube.com/watch?v=WWpd3GGzozY","width":854,"height":480,"providerName":"YouTube","thumbnailUrl":"http://i.ytimg.com/vi/WWpd3GGzozY/hqdefault.jpg","resolvedBy":"youtube"}" data-block-type="32" id="block-yui_3_17_2_6_1416584323551_48217">

WatchKit Swift Tutorial 6 - Synchronize NSTimer and WKInterfaceTimer

WatchKit Swift Tutorial 6 - Synchronize NSTimer and WKInterfaceTimer WatchKit Course: http://learn.iphonedev.tv/course/make-apps-for-apple-watch The WKInterfaceTimer runs only on the Apple Watch and doesn't have a callback to the code running in your app extension. In order to keep everything in sync you need to set a duration variable that is of type NSTimerInterval and set it for both the NSTimer and the WKInterfaceTimer.","source":"

WatchKit Swift Tutorial 6 - Synchronize NSTimer and WKInterfaceTimer WatchKit Course: http://learn.iphonedev.tv/course/make-apps-for-apple-watch The WKInterfaceTimer runs only on the Apple Watch and doesn't have a callback to the code running in your app extension. In order to keep everything in sync you need to set a duration variable that is of type NSTimerInterval and set it for both the NSTimer and the WKInterfaceTimer.

"},"hSize":null,"floatDir":null,"html":"","url":"https://www.youtube.com/watch?v=oGsFX1rEteQ","width":854,"height":480,"providerName":"YouTube","thumbnailUrl":"http://i.ytimg.com/vi/oGsFX1rEteQ/hqdefault.jpg","resolvedBy":"youtube"}" data-block-type="32" id="block-yui_3_17_2_6_1416584323551_49153">

Connect

  • Click the like button below if you enjoyed this post or any of the videos on YouTube.
  • I'll be teaching a on how to make apps for Apple Watch next year.
  • You can start my Swift iPhone app course today with 100+ videos.
Posted on November 21, 2014 and filed under iOS 8, Programming .

Parsing Int Variables in Swift - Optionals and Approaches

Working with integer numbers in Swift is a little different, since the only string parsing method is toInt() and it returns an optional Int? value.

This means that you have to test the value before you use it, or it could be nil. Doing a force unwrap can result in a crash if you try to use the value.

Below are two approaches you can leverage using the if/else statements.

Approach 1

if let width = widthTextField.text.toInt() {
    if let height = heightTextField.text.toInt() {
        // Valid user input parsed
        println("Valid width: \(width), height: \(height)")
    }
}

Approach 2

var width = widthTextField.text.toInt()
var height = heightTextField.text.toInt()

if(width != nil && height != nil) {
    // Valid user input parsed
    println("Valid width: \(width!), height: \(height!)")
}

The benefit of the second approach is that you can test multiple optionals in a single line. You don't have to nest tons of if/else statements to make sure the values are valid.

I'd like there to be a better approach, but these are the two that I discovered from playing around with optionals. It would be nice if I could use the tuple syntax from a switch statement with the if let keyword.

Double Approach

Working with Double parsing is a different story. It doesn't look like their is a method on String, so you have to cast it to an NSString to convert. Going down that route you lose the Optional values. Invalid casts will return 0.

var width = (widthTextField.text as NSString).doubleValue

A Better Double Approach

The above code doesn't fail elegantly with optional values, and instead may give strange results. Use the NSNumberFormatter and get the double value from the NSNumber object it creates.

var numberFormatter = NSNumberFormatter()
var userInputString = "10.33a0" // 10.33
if let number = numberFormatter.numberFromString(userInputString)?.doubleValue {
    println("Converted user input: \(number)")
} else {
    println("Invalid number: \(userInputString)")
}


Connect

  • Do you have a better approach?
  • Subscribe to my mailing list and get a free Swift video course.
  • I'm teaching an online Swift iPhone app course.

 

Posted on October 7, 2014 and filed under iOS 8, Programming .