1

假設我們有一個自定義控件,在某些狀態下應該彈出供用戶選擇的選項列表(UIAlertController)。通常,當我們在視圖控制器中使用presentViewController方法時,但在這種情況下,我們無法訪問擁有此方法的父級UIViewController。儘管似乎有某種方法可以從子視圖中訪問UIViewController,但它被認爲是針對MVC設計模式的。那麼你會如何做到這一點? 我想保持視圖控制器儘可能精簡和自定義視圖(uicontrol)自給自足,所以我不想將此邏輯移動到視圖控制器。 儘管您的建議和建議都受到歡迎和讚賞。你將如何presentViewController從子視圖?

+2

可能的重複[如何在不存在視圖控制器時呈現UIAlertController?](http://stackoverflow.com/questions/26554894/how-to-present-uialertcontroller-when-not-in-a-view-控制器) –

+1

一個選項將委派,你可以調用委託方法從你的自定義視圖到'view controller'來呈現一個視圖控制器 –

回答

4

您可以隨時使用應用程序RootViewController的呈現:)你不要總是要選擇您的視圖控制器的看法:) rootview控制器您的警報視圖控制器是始終可以訪問無論在哪裏你的控制是:)

這裏你可以做什麼:)

目標C

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
[delegate.window.rootViewController presentViewController:your_alert_view_controller animated:YES completion:nil]; 

斯威夫特

let appDelegate : AppDelegate? = UIApplication.sharedApplication().delegate as? AppDelegate 
if let unwrappedAppdelegate = appDelegate { 
    unwrappedAppdelegate.window!.rootViewController! .presentViewController(alert, animated: true, completion: nil) 
} 

希望我的回答幫你:)

+0

你有。勢必 :) ? – BallpointBen

+0

@james:抱歉,哥們我叮囑你:我寫錯了什麼? –

+0

@Sandeep工作。把它稱爲這樣的 - UIApplication.sharedApplication()keyWindow .rootViewController .presentViewController(optionMenu,動畫:真,完成:無) – mra214

1

我寧願代表團或目標的行動。這是更清潔的方式,因爲在這種情況下,您不使用AppDelegate。此外,展示內容也不是子視圖的責任。例如用委派:

protocol MyViewDelegate: class { 
    func somethingHappenedToMyView(view: MyView) 
} 

class MyView: UIView { 
    weak var delegate: MyViewDelegate? 

    func somethingHappened() { 
     delegate?.somethingHappenedToMyView(self) 
    } 
} 

class ViewController: UIViewController, MyViewDelegate { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     myView.delegate = self 
    } 

    func somethingHappenedToMyView(view: MyView) { 
     presentViewController(someViewController, animated: true, completion: nil) 
    } 
} 

例如用目標 - 動作:

class MyView: UIControl { 
    func somethingHappened() { 
     sendActionsForControlEvents(.ValueChanged) // .ValueChanged is an example. Maybe other events will be more meaningful for your situation 
    } 
} 

class ViewController: UIViewController, MyViewDelegate { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     myView.addTarget(self, action: #selector(self.somethingHappenedToMyView(_:)), forControlEvents: .ValueChanged) 
    } 

    func somethingHappenedToMyView(view: MyView) { 
     presentViewController(someViewController, animated: true, completion: nil) 
    } 
} 
+0

是的,我想用委託確實應該會更好。?做法。但這種方式MyCustomControl停止自成一體的解決方案,我需要提供數據給視圖控制器以某種方式呈現它。然後,用戶選擇一些值後,我需要將其返回到UI控制,並決定接下來要做什麼。 – mra214

0

從代表根視圖控制器呈現不會在許多情況下工作(嵌套介紹,選項卡的多個控制器等)。

通過在視圖的響應者鏈中循環,更好地找到父級UIViewController響應者。使用這個宏:

#define UIViewParentController(__view) ({ \ 
UIResponder *__responder = __view; \ 
while ([__responder isKindOfClass:[UIView class]]) \ 
__responder = [__responder nextResponder]; \ 
(UIViewController *)__responder; \ 
}) 

鑑於:

UIViewController *parentViewController = UIViewParentController(self); 

相關的問題:onetwo

相關問題