我有 2 個控制器:MainVC 和 SideMenuVC。
我想使用 SideMenuVC 修改 MainVC,因此創建了 SideMenuVC 的委托(此外,故事板上的Emdebed 將“名稱...”轉為“側邊選單視圖控制器”,因為 MainViewController 具有包含ContainerView的子視圖 - 這個容器是我們的 SideMenuVC。這個代表按他應該的方式作業。
但是,由于應用程式中的邏輯,我還需要將資料從MAINVC發送到SIDEMENUVC。
所以我也做了同樣的事情——創建了第二個 VC 的另一個代表......但我發現,MainViewControllerDelegate 在 SideMenuViewController 中沒有回應。而我完全無能為力...
是的,我確實在兩個類中實作了必要的協議,擴展!
下面兩個 VC 的代碼,附件中的故事板螢屏
MainViewController MainViewControllerDelegate
protocol MainViewControllerDelegate{
func isImageLoaded(_ isLoaded:Bool)
}
class MainViewController: UIViewController {
/* ... */
var delegate: MainViewControllerDelegate?
var sideMenuViewController: SideMenuViewController?
private var isSideMenuPresented:Bool = false
private var isImageLoaded:Bool = false
override func viewDidLoad() {
super.viewDidLoad()
self.isImageLoaded = false
self.setupUI()
self.delegate?.isImageLoaded(false)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "MainVC_SideMenuVC_Segue")
{
if let controller = segue.destination as? SideMenuViewController
{
self.sideMenuViewController = controller
self.sideMenuViewController?.delegate = self
}
}
}
/* ... */
//I'm using PHPicker, and when new image is selected, i want to send "true" via delegate
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
dismiss(animated: true)
if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self){
let previousImage = self.presentedImage.image
itemProvider.loadObject(ofClass: UIImage.self){ [weak self] image, error in
DispatchQueue.main.async {
guard let self = self, let image = image as? UIImage, self.presentedImage.image == previousImage else {
return
}
self.presentedImage.image = image
self.isImageLoaded = true;
self.delegate?.isImageLoaded(true)
}
}
}
}
SideMenuViewController SideMenuViewControllerDelegate
protocol SideMenuViewControllerDelegate{
func hideSideMenu()
func performAction(_ type:OperationType)
}
class SideMenuViewController: UIViewController {
/*...*/
var delegate: SideMenuViewControllerDelegate?
var mainViewController: MainViewController?
private var menuData: [ExpandingCellModel] = []
private var isImageLoaded: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
// self.mainViewController?.delegate = self
menuData = setupData()
setupUI()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? MainViewController {
controller.delegate = self
}
}
}
/* ...
*/
uj5u.com熱心網友回復:
這就是我認為正在發生的事情。
從 MainVC 到 SideMenuVC 發生了轉場,但我認為 SideMenuVC 到 MainVC 之間實際上沒有發生轉場。
發生是關鍵字,因為從 MainVC 到 SideMenuVC 有一個 EmbedSegue 但從 SideMenuVC 到 MainVC 的轉場在哪里?你在故事板中做了一些聯系,但在我看來什么都沒有發生。
這就是為什么 inoverride func prepare被按計劃呼叫MainViewControllerDelegate并且委托被設定但它沒有被設定,SideMenuViewController因為override func prepare沒有被呼叫,因為沒有發生segue 。
你能做什么,而不是可能的作業設定里面既代表prepare在MainViewControllerDelegate
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "MainVC_SideMenuVC_Segue")
{
if let sideMenuVC = segue.destination as? SideMenuViewController
{
sideMenuVC.delegate = self
// assign MainViewControllerDelegate here
self.delegate = sideMenuVC
}
}
}
現在檢查資料是否也發送回主視圖控制器。
如果您的問題仍未解決,請查看并嘗試我在 github 中為您設定的這個小示例,以顯示 mainVC 和 EmbeddedVC 之間的資料傳遞,它可能會給您一些提示。
您可以在此處查看此操作的結果:https : //youtu.be/J7C7SEC04_E
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419492.html
標籤:
上一篇:如何在不相關的ViewController之間傳遞資料
下一篇:故事板中較低的Z視圖索引
