2014-11-19 3 views
0

Я застрял на попытке передать переменную из одного вида в другой. Я намеренно делаю это все программно без Story Boards.Передача маркера OAuth между представлениями программно в Swift

ViewController создает UIButton, который при нажатии вызывает AuthoriseController.

AuthoriseController затем загружает UIWebView, открывая его по определенному URL-адресу, например. https://foursquare.com/oauth2/authenticate?client_id=xxxxx&response_type=token&redirect_uri=yyyyy

Это загружает экран OAuth. После входа в систему элемент управления возвращается в AuthoriseController, где я извлекаю access_token, который возвращается в URI переадресации.

Exctraction отлично работает, и я могу получить токен, моя проблема в том, что я хочу вернуть токен моему ViewController, чтобы при повторном нажатии кнопки он будет доступен для HTTP-запроса (на данный момент я просто печатаю токен).

My ViewController и AuthoriseController реализуют протокол под названием DataProtocol, который, как я надеялся, может использовать общий токен между контроллерами.

ViewController:

import UIKit 

class ViewController: UIViewController { 

var delegate: DataProtocol? = nil 

func setUpView(){ 
    let firstView = UIView() 
    let button = UIButton.buttonWithType(UIButtonType.System) as UIButton 
    firstView.setTranslatesAutoresizingMaskIntoConstraints(false) 
    firstView.backgroundColor = UIColor(red: 0.75, green: 0.75, blue: 0.1, alpha: 1.0) 
    view.addSubview(firstView) 
    setUpButton(button) 
    firstView.addSubview(button) 
    setUpConstraints(firstView, button) 
} 

func setUpConstraints(firstView: UIView, _ button: UIButton) { 
    let viewsDictionary = ["firstView":firstView,"button":button] 
    let metricsDictionary = ["firstViewHeight":1334.0,"viewWidth":750.0 ] 
    let firstViewHeightConstraintH:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:[firstView(viewWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary) 
    let firstViewHeightConstraintV:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:[firstView(firstViewHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary) 

    firstView.addConstraints(firstViewHeightConstraintH) 
    firstView.addConstraints(firstViewHeightConstraintV) 

    let buttonConstraintH:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:|-150-[button(>=80)]", options: NSLayoutFormatOptions.AlignAllCenterY, metrics: nil, views: viewsDictionary) 
    let buttonConstraintV:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:|-300-[button]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 

    firstView.addConstraints(buttonConstraintH) 
    firstView.addConstraints(buttonConstraintV) 
} 

func setUpButton(button: UIButton) { 
    button.setTranslatesAutoresizingMaskIntoConstraints(false) 
    button.setTitle("Authorise", forState: UIControlState.Normal) 
    button.addTarget(self, action: "buttonPressed", forControlEvents: UIControlEvents.TouchUpInside) 
    button.backgroundColor = UIColor.blueColor() 
    button.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal) 
} 

override func shouldAutorotate() -> Bool { 
    return false 
} 

func buttonPressed(){ 
    let ac = AuthoriseController() 
    self.presentViewController(ac, animated: true, completion: nil) 
    println("token in ViewController.buttonPressed: [\(self.delegate?.token)]") 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    view.backgroundColor = UIColor(red: 0.9, green: 0.9, blue: 1, alpha: 1.0) 
    setUpView() 
} 
override func supportedInterfaceOrientations() -> Int { 
    return Int(UIInterfaceOrientationMask.All.toRaw()) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
} 

AuthoriseController:

import UIKit 
import WebKit 

class AuthoriseController: UIViewController, UIWebViewDelegate, DataProtocol { 

var token: String = "" 

let AUTH_URL = "https://foursquare.com/oauth2/authenticate?client_id="; 
let RESP_TYPE_AND_KEY_AND_TOKEN = "&response_type=token&redirect_uri="; 
let REDIRECT_URI : String = "ZZZZZZZZ"; 
let CLIENT_ID : String = "XXXXXXX"; 

var webview: UIWebView = UIWebView() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    var myViewController = ViewController() 

    self.webview.frame = self.view.bounds 
    self.webview.delegate = self 
    self.view.addSubview(self.webview) 

    var url: NSURL = NSURL.URLWithString(AUTH_URL + CLIENT_ID + RESP_TYPE_AND_KEY_AND_TOKEN + REDIRECT_URI) 
    var urlRequest: NSURLRequest = NSURLRequest(URL: url) 
    self.webview.loadRequest(urlRequest) 
} 

func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool { 
    token = getToken(request.URL.absoluteString!) 
    println("token in AuthoriseController.webView: [\(token)]") 
    if(!token.isEmpty) { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    return true 
} 

func getToken(url: String) -> String { 
    var token = "" 
    if url.rangeOfString("#access_token") != nil{ 
     token = url.componentsSeparatedByString("=").last! 
    } 
    return token 
} 
} 

Вот DataProtocol:

import Foundation 

protocol DataProtocol { 
    var token : String { get set } 
} 

Когда я делаю это:

  1. Запуск приложения
  2. При нажатии на кнопку Авторизовать
  3. Успешно войдя в систему (управление возвращается ViewController
  4. При повторном нажатии кнопки

Вывод: Я получаю этот выход:

token in ViewController.buttonPressed: [nil] 
token in AuthoriseController.webView: [] 
token in AuthoriseController.webView: [] 
token in AuthoriseController.webView: [] 
token in AuthoriseController.webView: [VSKRNHJRS3NWPN3EEIYMCSZYJ2YMNSH4GBXNQFL1EMYLJ5TO] 
token in ViewController.buttonPressed: [nil] 
token in AuthoriseController.webView: [] 
token in AuthoriseController.webView: [VSKRNHJRS3NWPN3EEIYMCSZYJ2YMNSH4GBXNQFL1EMYLJ5TO] 

Я надеялся увидеть токен во втором появлении ViewController.buttonPressed вместо NIL.

Может ли кто-нибудь увидеть, где я ошибаюсь? Любая помощь очень ценится! Steve

ответ

0

Похоже, что делегат подключен правильно, но вы не отправляете ему токен. В AuthoriseController вам необходимо установить токен для делегата:

func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool { 
    token = getToken(request.URL.absoluteString!) // sets the token in the AuthoriseController 
    println("token in AuthoriseController.webView: [\(token)]") 
    if(!token.isEmpty) { 
     // pass the token to the delegate 
     self.delegate?.token = token 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    return true 
} 
Смежные вопросы