尝试从父级 IOS swift 3 中删除子级时,我的代表为零
Posted
技术标签:
【中文标题】尝试从父级 IOS swift 3 中删除子级时,我的代表为零【英文标题】:My delegate is nil when trying to remove child from parent IOS swift 3 【发布时间】:2017-07-06 12:10:27 【问题描述】:我有一个接管整个父视图的子视图。我希望通过使用协议从父级调用方法将子级从父级中删除,但我的委托每次都是 nil。如果您需要更多信息,我会在下面添加我的示例作品,请告诉我
protocol childDelegate: class
func removeFromParent()
class ChildAction: UITableViewController
@IBAction func btnRemove(_sender: Any)
if(delegate != nil)
self.delegate?.removeFromParent()
class ParentClass: UIViewController:childDelegate
var delegate:childDelegate?
private ChildActionView:ChildAction
let storyboard = UIStoryBoard(name: "Main", bundle: Bundle.main)
let viewC = storyboard.instantiateViewController(withIdentifier: "ChildAction") as! ChildAction
self.delegate = viewC as? childDelegate
self.addChildViewController(viewC)
return viewC
@IBAction func btnAddChild(_sender: Any)
addChild(child:ChildActionView)
func addChild(child: UIViewController)
self.addChildViewController(child)
view.addSubview(child.view)
child.didMove(toParentViewController: self)
func removeFromParent()
//remove from parent
Child view controller parent view controller image
【问题讨论】:
@DharmeshKheni 我在代码 sn-p 下添加了两个图像 删除所有代码图像。复制所有代码 @Honey 你成功了 【参考方案1】:您没有在代码中的哪个位置设置ChildAction
实例(您的childVC
)的delegate
变量。您将 parent's delegate
设置为 child,但这在您的代码中毫无意义。您需要将child's delegate
设置为父级。目前孩子没有任何父母的参考,所以它的代表自然是nil
。如果有不清楚的地方请告诉我。
【讨论】:
【参考方案2】:我强烈建议您阅读一两篇关于委托模式的文章或教程。如果您对应该如何工作有一个基本的了解,事情会容易得多。
将此代码与您发布的代码进行比较。看看有没有道理。
protocol childDelegate: class
func removeFromParent()
class ChildAction: UIViewController
// this class gets the delegate, because it wants to "call back" to a delegated function
var delegate:childDelegate?
@IBAction func btnRemove(_sender: Any)
// IF delegate has been assigned, call its function
delegate?.removeFromParent()
class ParentClass: UIViewController, childDelegate
// bad naming... would be much clearer if it was "childActionViewController" or "childActionVC"
private let ChildActionView: ChildAction =
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewC = storyboard.instantiateViewController(withIdentifier: "ChildAction") as! ChildAction
return viewC
()
@IBAction func btnAddChild(_sender: Any)
// add the child view controller
self.addChildViewController(ChildActionView)
// set its delegate to self
ChildActionView.delegate = self
// add its view to the hierarchy
view.addSubview(ChildActionView.view)
// finish the process
ChildActionView.didMove(toParentViewController: self)
func removeFromParent()
//remove from parent
print("removeFromParent() called...")
【讨论】:
你是对的我明白我的错误我会复习一些教程来更好地理解委托模式以上是关于尝试从父级 IOS swift 3 中删除子级时,我的代表为零的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate @OneToMany 在更新父级时从列表中删除子级
在 useEffect() 钩子中从父级传递的子级调用函数,React