AJ McCaw AJ McCaw - 2 months ago 9
Swift Question

Trying to save user info to parse alternative Syncano with swift

I'm super stuck on this because the Syncano docs aren't great at explaining...
I'm building a simple chat app with Syncano backend (R.I.P Parse) and all I want to do is save the First Name, Last Name, and a unique username which they can pick. I have managed to connect the user to the server already and can see them in my list of classes, but the additional info for the user doesn't show. I have a view controller called

Signup View Controller
which handles all the interaction with the labels and button all connected. It is worth mentioning this is my first app and I am a beginner in programming, so I need someone with a little bit experience to give me a few pointers on which its not saving the users Name and unique username.

This is the how I want to send the data to Syncano when pressed:

class SignupViewController: UIViewController {

var delegate : LoginDelegate?
var @IBAction func signupPressed(sender: AnyObject) {
var huddleusernameText = usernameTextField.text
var firstNameText = firstNameTextField.text
var lastNameText = lastNameTextField.text
var passwordText = passwordTextField.text
var repeatPasswordText = repeatPasswordTextField.text
var emailText = emailTextField.text

func registerUser(username: String, password: String, first_name: String, last_name: String, email: String)
{
SCUser.registerWithUsername(username, password: password)
{ error in
//handle user registration
if (error != nil)
{
//handle error
print("Sign Up, error: \(error)")
}
}
}

self.signUp(self.getUsername()!, password: self.getPassword()!, finished:
{ error in
if (error != nil) {
//handle error
print("Sign Up, error: \(error)")
} else
{
SCUser.currentUser()
self.addNewUser()
self.delegate?.didSignUp()

}
})

func signUp(username: String, password: String, finished: (NSError!) -> ()) {
SCUser.registerWithUsername(username, password: password) { error in
finished(error)
}
}

// Syncano docs mentions using this, but I'm not sure how to use this piece of code to store user data...
class MyUserProfile : SCUserProfile {
var avatar : SCFile? = nil;
var first_name = ""
var last_name = ""
var email = ""
var username = ""
}


This is something additional

func addNewUser() {
let user = MyUserProfile()
user.first_name = firstNameTextField.text!
user.last_name = lastNameTextField.text!
user.email = emailTextField.text!
user.huddle_username = usernameTextField.text!
user.saveWithCompletionBlock { error in
//Handle error
}
}


I will update this question if I run into any new solutions but for now, this is it.

Answer

You can find more details in the docs: http://docs.syncano.io/docs/ios#section-subclassing-user-and-user-profile, which talks about your own subclass of user profile to use custom fields (like first name and last name).

I know you already have your own custom user profile, but I feel it will be better if I explain it from the beginning.

First, you need to edit user_profile class, easiest would be through the Dashboard and add there first_name and last_name properties.

Next, create your own custom user_profile class:

import syncano_ios

class MyUserProfile: SCUserProfile {
    var first_name = ""
    var last_name = ""
}

Before you can use it, register it somewhere in your app (e.g. in viewDidLoad of your main class, or even in AppDelegate, in func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool method) using:

SCUser.registerClassWithProfileClass(MyUserProfile.self)

You can now write your code that will save first and last name into user profile:

func saveName() {
    guard let profile = SCUser.currentUser().profile as? MyUserProfile else {
        return
    }
    profile.first_name = "Firstname" //get it from e.g. text field
    profile.last_name = "Lastname" //get it from e.g. text field
    profile.saveWithCompletionBlock { error in
    }
}

Now, modify your code. Instead of calling addNewUser, call saveName method:

self.signUp(self.getUsername()!, password: self.getPassword()!, finished:
        { error in
    if (error != nil) {
                //handle error
                print("Sign Up, error: \(error)")
    } else
    {
        self.saveName()
        self.delegate?.didSignUp()

    }
})

The main difference between this code and the one you posted, is that you were trying to create a new user_profile object - that is impossible to do. Instead, Syncano add a new user_profile every time a new user is created. So what you need to do, is just take the user_profile of the new user, and modify it with by adding first and last name.