更新後、iOS10バージョンでコンパイルされていないポッドweblogin。
iOSの11.0バージョンに変更すると、次のように表示されます。
InstagramLoginWebView
プロパティを使用してください。InstagramLoginWebViewProtocol
クロージャープロパティを使用してください。InstagramLoginWebViewDelegateをInstagramLoginWebViewProtocolに変更した場合:
私のコード:
クラスLoginViewController:UIViewController {
var loginWebView: InstagramLoginWebView! = nil
override func viewDidLoad() {
super.viewDidLoad()
loginWebView = InstagramLoginWebView(frame: self.view.frame)
self.view.addSubview(loginWebView!)
loginWebView?.loginDelegate = self **-- Cannot assign value of type 'LoginViewController' to type 'InstagramLoginWebViewDelegate?'**
self.loginWebView?.loadInstagramLogin(isNeedPreloadForCookieSync: true) **--Argument passed to call that takes no arguments**
}
}
拡張LoginViewController:InstagramLoginWebViewProtocol {-'InstagramLoginWebViewProtocol 'では、' LoginViewController 'が' UIView 'から継承する必要があります
func userLoggedSuccessfully() {
print("User Logged Successfully")
DispatchQueue.main.async {
self.loginWebView.removeFromSuperview()
}
}
ねえ@ effecttwins😊
InstagramLoginWebView
は前回の更新で大幅に変更され、非互換性のためにiOS 10.*
サポートを削除する必要がありました。
loginDelegate
の使用は、機能はしますが、推奨されなくなりました。
慣れている動作を取得するために必要なのは、 loginWebView
次のプロパティを設定することだけです。
didReachEndOfLoginFlow
は、以前のredirected
ように呼ばれる_closure_です。didSuccessfullyLogIn
は、_delegate_のuserLoggedSuccessfully()
置き換える_closure_です。completionHandler
は、_delegate_のwebViewFinishedToLoadUser(sessionChache:handler:)
置き換える_closure_です。これは1.7.*
の更新されたコードです。
class LoginViewController: UIViewController {
var loginWebView: InstagramLoginWebView!
override func viewDidLoad() {
super.viewDidLoad()
loginWebView = InstagramLoginWebView(frame: self.view.frame,
didSuccessfullyLogIn: { [weak self] in DispatchQueue.main.async { self?.loginWebView.removeFromSuperview() }},
completionHandler: { sessionCache, handler in /* do whaterver you need to */ })
view.addSubview(loginWebView)
loginWebView.loadInstagramLogin()
}
}
したがって、拡張子InstagramLoginWebViewDelegateをInstagramLoginWebViewProtocolに変更すると、次のように表示されます。「InstagramLoginWebViewProtocol」では、「LoginViewController」が「UIView」から継承する必要があります。
コード:
拡張LoginViewController:InstagramLoginWebViewDelegate {
func userLoggedSuccessfully() {
print("User Logged Successfully")
}
func webViewFinishedToLoadUser(sessionCache: SessionCache, handler: APIHandlerProtocol) {
print("Loading user with sessioncache is successful")
do{
let encoder = JSONEncoder()
let data = try encoder.encode(sessionCache)
let sessionCacheString = String(data: data, encoding: .utf8)
}catch {
print("Whoops, an error occured: \(error)")
}
}
InstagramLoginWebViewProtocol
準拠しないでください。
internal
マークしなかった私のせい。 謝罪します。
これが必要なすべてのコードです。 InstagramLoginWebViewProtocol
ありません。 InstagramLoginWebViewDelegate
ありません。
import UIKit
import SwiftyInsta
class LoginViewController: UIViewController {
var loginWebView: InstagramLoginWebView!
override func viewDidLoad() {
super.viewDidLoad()
loginWebView = InstagramLoginWebView(frame: view.frame,
didReachEndOfLoginFlow: nil,
didSuccessfullyLogIn: { [weak self] in
// I would actually put this in `didReachEndOfLoginFlow`,
// so the user never sees their timeline blinking.
DispatchQueue.main.async {
self?.loginWebView.removeFromSuperview()
}
},
completionHandler: { sessionCache, _ in
print("Loading user with sessioncache is successful")
do {
let encoder = JSONEncoder()
let data = try encoder.encode(sessionCache)
let sessionCacheString = String(data: data, encoding: .utf8)
} catch {
print("Whoops, an error occured: \(error)")
}
})
view.addSubview(loginWebView)
loginWebView.loadInstagramLogin()
}
}
@sbertixすべての助けに感謝します。
しかし、Instagramのログインページがロードされていません画面に白いページしかありません
これが必要なすべてのコードです。
InstagramLoginWebViewProtocol
ありません。InstagramLoginWebViewDelegate
ありません。
@effecttwinsは、上記で記述したコードをコピーして貼り付けます。 loadInstagramLogin()
を呼び出すことを忘れないでください。
それは文字通りすでにあなたのために実装されています😊
できます
はい、すべてのコードをコピーして貼り付け、loadInstagramLoginを呼び出しました:)
InstagramLoginWebViewProtocolとInstagramLoginWebViewDelegateも削除されました
コンソールでこのエラーが発生します。このプロジェクトに関連しているかどうかはわかりません。
サービスに通知できませんでしたcom.apple.WebKit.Networking:113:指定されたサービスが見つかりませんでした
申し訳ありませんが、コードのview
にloginWebView
を追加したことはありません。
編集しました。 もう一度確認してください。 @effecttwinsで動作するはず
あなたは素晴らしい@sbertixです
現在動作中です
助けてくれてありがとう
ねえ@sbertix
MVVMパターンに従っていて、ビューとviewControllerが異なるファイルにある場合はどうなりますか? ビューはViewControllerにデータを送信しないでください。 InstagramLoginWebViewの初期化後にdidSuccessfullyLogIn
関数にアクセスする方法はありますか?
あなたはする必要はありませんinit
InstagramLoginWebView
とdidSuccessfullyLogIn
(これはオプションです)。
そして、他の_closures_でも:一度取得したら、単に別の値を割り当てることができます。
@anonrig
質問があれば、この例を教えていただけますか? @sbertix :)
もちろん。 コードに関する詳細情報を送信できますか? たとえば、モデルとビューの設定方法。
ええ、もちろん!
1.7.xより前は、 delegates
を使用してViewControllerレベルでログイン成功イベントを処理していました。
ビューの例:
final class LoginWebView: UIView {
// MARK: - Properties
var bag = DisposeBag()
private(set) lazy var webView: InstagramLoginWebView = InstagramLoginWebView(frame: UIScreen.main.bounds)
private(set) lazy var closeButtonLabel: UILabel = {
let label: UILabel = .create(text: "Close".localized(), numberOfLines: 1, textAlignment: .center, textColor: .white, font: .light(size: 16))
label.isUserInteractionEnabled = true
return label
}()
private(set) lazy var closeButtonBarItem: UIBarButtonItem = UIBarButtonItem(customView: closeButtonLabel)
// MARK: - Initialization
init() {
super.init(frame: .zero)
[webView].forEach(addSubview(_:))
webView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
ViewControllerの例:
final class LoginWebViewController: UIViewController, View, ErrorDisplayer {
// MARK: - Properties
private lazy var viewSource = LoginWebView()
private(set) var bag: DisposeBag
private(set) var viewModel: LoginWebViewModel
private(set) var completionObservable = PublishSubject<(SessionCache?, APIHandlerProtocol?)?>()
// MARK: - Initialization
init() {
bag = DisposeBag()
viewModel = LoginWebViewModel()
super.init(nibName: nil, bundle: nil)
bindErrorHandling()
observeDatasource()
}
// MARK: - Life cycle
override func loadView() {
view = viewSource
view.backgroundColor = .white
}
override func viewDidLoad() {
super.viewDidLoad()
viewSource.webView.loginDelegate = self
viewSource.webView.loadInstagramLogin(isNeedPreloadForCookieSync: true)
// viewSource.webView.didSuccessfullyLogIn
configureNavBar(with: "Login".localized(), prefersLargeTitle: false)
navigationItem.rightBarButtonItem = viewSource.closeButtonBarItem
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
LoginWebViewModel
が何であるか正確にはわかりませんが、目的がすべてをcompleteObservable
入れることである場合は、次のようにするだけです。
final class LoginWebView: UIView {
// MARK: - Properties
var bag = DisposeBag()
private(set) lazy var webView: InstagramLoginWebView = InstagramLoginWebView(frame: UIScreen.main.bounds, completionHandler: nil)
private(set) lazy var closeButtonLabel: UILabel = {
let label: UILabel = .create(text: "Close".localized(), numberOfLines: 1, textAlignment: .center, textColor: .white, font: .light(size: 16))
label.isUserInteractionEnabled = true
return label
}()
private(set) lazy var closeButtonBarItem: UIBarButtonItem = UIBarButtonItem(customView: closeButtonLabel)
// MARK: - Initialization
init() {
super.init(frame: .zero)
[webView].forEach(addSubview(_:))
webView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
final class LoginWebViewController: UIViewController, View, ErrorDisplayer {
// MARK: - Properties
private lazy var viewSource = LoginWebView()
private(set) var bag: DisposeBag
private(set) var viewModel: LoginWebViewModel
private(set) var completionObservable = PublishSubject<(SessionCache?, APIHandlerProtocol?)?>()
// MARK: - Initialization
init() {
bag = DisposeBag()
viewModel = LoginWebViewModel()
super.init(nibName: nil, bundle: nil)
bindErrorHandling()
observeDatasource()
}
// MARK: - Life cycle
override func loadView() {
view = viewSource
view.backgroundColor = .white
}
override func viewDidLoad() {
super.viewDidLoad()
viewSource.webView.completionHandler = { [weak self] cache, handler in
self?.completionObservable.accept((cache, handler))
}
viewSource.webView.loadInstagramLogin()
// viewSource.webView.didSuccessfullyLogIn
configureNavBar(with: "Login".localized(), prefersLargeTitle: false)
navigationItem.rightBarButtonItem = viewSource.closeButtonBarItem
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
InstagramLoginWebView
init(frame:)
をinit(frame:completionHandler:)
してから、 completionHandler
を更新して、件名に値をプッシュしました。
ありがとう@sbertix