尝试从父级 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 在更新父级时从列表中删除子级

如何从父级获取数据到子级?

数据未在 VueJS 中使用提供/注入从父级注入到子级

在 useEffect() 钩子中从父级传递的子级调用函数,React

如何正确使用 Angular 中的 Observable 将数组数据从父级发送到子级?

Swift 3.0:当给定非 SKView 父级时,SKSpriteNode 作为 Button 不起作用?