假設我們有一個自定義控件,在某些狀態下應該彈出供用戶選擇的選項列表(UIAlertController)。通常,當我們在視圖控制器中使用presentViewController方法時,但在這種情況下,我們無法訪問擁有此方法的父級UIViewController。儘管似乎有某種方法可以從子視圖中訪問UIViewController,但它被認爲是針對MVC設計模式的。那麼你會如何做到這一點? 我想保持視圖控制器儘可能精簡和自定義視圖(uicontrol)自給自足,所以我不想將此邏輯移動到視圖控制器。 儘管您的建議和建議都受到歡迎和讚賞。你將如何presentViewController從子視圖?
回答
您可以隨時使用應用程序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)
}
希望我的回答幫你:)
你有。勢必 :) ? – BallpointBen
@james:抱歉,哥們我叮囑你:我寫錯了什麼? –
@Sandeep工作。把它稱爲這樣的 - UIApplication.sharedApplication()keyWindow .rootViewController .presentViewController(optionMenu,動畫:真,完成:無) – mra214
我寧願代表團或目標的行動。這是更清潔的方式,因爲在這種情況下,您不使用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)
}
}
是的,我想用委託確實應該會更好。?做法。但這種方式MyCustomControl停止自成一體的解決方案,我需要提供數據給視圖控制器以某種方式呈現它。然後,用戶選擇一些值後,我需要將其返回到UI控制,並決定接下來要做什麼。 – mra214
從代表根視圖控制器呈現不會在許多情況下工作(嵌套介紹,選項卡的多個控制器等)。
通過在視圖的響應者鏈中循環,更好地找到父級UIViewController響應者。使用這個宏:
#define UIViewParentController(__view) ({ \
UIResponder *__responder = __view; \
while ([__responder isKindOfClass:[UIView class]]) \
__responder = [__responder nextResponder]; \
(UIViewController *)__responder; \
})
鑑於:
UIViewController *parentViewController = UIViewParentController(self);
- 1. PresentViewController不呈現視圖
- 2. 你如何在Backbone中追加你的子視圖?
- 3. 如何從子視圖
- 4. 如何將子視圖的子視圖置頂?
- 5. 使用presentViewController在視圖之間導航?
- 6. presentViewController()彈出最後一個視圖
- 7. presentViewController沒有消失父視圖
- 8. 透明背景的視圖presentViewController
- 9. 如何使用'presentViewController'的封面視圖和主頁
- 10. 如何與使用presentViewController顯示的視圖進行交互?
- 11. 如何將子視圖添加到子視圖的滾動視圖
- 12. 你如何截圖ARKit相機視圖?
- 13. 從子視圖
- 14. iPhone:如何將視圖保存爲圖像? (ex.save你畫什麼)
- 15. 如何將視圖(如在RelativeLayout中)與侄子視圖對齊?
- 16. 如何將數據從子視圖傳遞到父視圖或子視圖之間?
- 17. 如何使用presentViewController
- 18. 如何將一個UIImageView的子視圖
- 19. 如何將子視圖添加到ContainerView
- 20. 如何將子視圖添加到Android
- 21. 如何將子視圖添加到UIViewController?
- 22. 如何將videoPlayer添加爲子視圖?
- 23. 如何從navigationController中刪除子視圖?
- 24. 如何從scrollview中刪除子視圖?
- 25. 如何從子視圖調用viewWillAppear
- 26. 如何從子視圖調用presentModalView?
- 27. 如何從Superview中刪除子視圖?
- 28. 如何從一個子視圖
- 29. 你如何在UITableViewCell中重新定位子視圖?
- 30. 如何在Angular 2中將數據從子視圖傳遞到主視圖?
可能的重複[如何在不存在視圖控制器時呈現UIAlertController?](http://stackoverflow.com/questions/26554894/how-to-present-uialertcontroller-when-not-in-a-view-控制器) –
一個選項將委派,你可以調用委託方法從你的自定義視圖到'view controller'來呈現一個視圖控制器 –