簡體   English   中英

不在視圖控制器上呈現視圖控制器 - Swift / Objective-C

[英]Present View Controller without being on a View Controller - Swift / Objective-C

我正在創建一個實現FacebookTwitter服務的應用程序。 在我看來,我有一個按鈕可以在Facebook / Twitter上切換共享。 如果未連接Facebook / Twitter ,則該按鈕將顯示“connect to”。

當我單擊按鈕時,我的控制器(而不是我的viewcontroller)中的方法將嘗試切換值,因為此控制器會跟蹤我的應用程序的狀態。 當我沒有連接到社交網絡時,我的控制器會注意到並將調用正確的服務。 此服務將啟動webview以提供用戶憑據。

現在我的問題是:

當我在服務中時,我需要通過webview提供憑據。 當我想要顯示這個webview時,我需要傳遞一個將處理演示的View Controller 我如何在這里提供viewcontroller?

方法我發現:

  • 調用appdelegate單例並獲取當前呈現的viewcontroller(我發現這很臟但是如果我錯了就糾正我)。
  • 因為我在appdelegate.didFinishLaunchingWithOptions中將我的服務注入我的控制器,所以我可以注入appdelegate的UIWindow並詢問當前呈現的viewcontroller(幾乎與第一種方法相同)
  • 創建由viewcontroller實現的協議。 該服務具有與該協議相同的屬性,並且在我的app委托中將viewcontroller注入到服務中。
  • 在您的控制器中有一個屬性作為presentationviewcontroller,讓您的控制器實現方法#3協議。 當觸發該協議的功能時,控制器將處理它並使用presentationviewcontroller屬性進行webview。 我只需要在appdelegate中將一個viewcontroller注入我的控制器。
  • 不要在該服務中實現任何相關的視圖。

我目前的實施方法是方法#3。

如果有些事情不清楚,請告訴我。

任何幫助表示贊賞! 提前致謝!

我希望這個問題能得到更多的關注,我很想知道其他人會如何處理這種情況。

正如您已經說過的,有幾種方法可以實現您的需求,但答案取決於對應用程序的了解。

我肯定會盡量保持業務邏輯和UI盡可能分開,有兩種方法我可以想到這樣做,但它們幾乎是一回事。

  1. 使用回調函數使(非UI)控制器負責登錄檢查,然后您可以讓控制器負責業務邏輯,並且調用ViewController負責由於該檢查而呈現任何UI。

  2. 正如您所建議的那樣,使用協議,您的控制器可以擁有一個委托,它將是一個符合您協議的ViewController。 然后用法只是獲取您的共享實例,設置委托並調用所需的功能。

我傾向於選擇2更像Swift,因為它是一種面向協議的語言。

如果控制器全局操作並且從應用程序內的任何地方訪問,您可能最終會復制大量代碼來進行這些檢查,您可以通過創建UIViewController的擴展來解決這個問題,該擴展提供了與控制器交互的功能。

我希望這會有所幫助,看到其他人接近這一點的方式肯定會很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM