首页 文章

如何使用未直接连接的viewcontroller的协议和委托方法?

提问于
浏览
-1

我是swift和iOS开发的新手 . 我对协议和委托方法有疑问 .

我有一个4伏特的说vc1,vc2,vc3,vc4 . 我正在从vc1-> vc2-> vc3-vc4-> vc1导航 . 那是从vc4,我使用导航控制器弹回到vc1 .

我有一个协议和方法就像

protocol myProtocol{

func myFunc()

}

在vc4中,我作为代表,

var delegate:myProtocol?

并且我在按钮动作中使用它作为

if let delegate = self.delegate{

delegate.myFunc()
}

并且还将vc4弹回vc1 .

现在在VC1中,我将myProtocol扩展为

class vc1:myProtocol{

override func viewDidLoad()
{

let vcProtocol = vc4()
vc4.delegate = self

}

func myFunc()
{
print("executing this")

}

}

但它不起作用 . 我可以这样做吗?如何使用委托和协议将这些连接到类 . 请帮助我

3 回答

  • 0

    如果控制器没有被销毁,viewDidLoad只执行一次 .

    例如,尝试在viewWillAppear中调用 .

    此外,您无需更改vc4的委托,只需将委托再次设置为vc1(在viewWillAppear中) .

  • 0

    你试过通知吗?在您的VC1 ViewController ViewDidLoad方法中:

    NotificationCenter.default.addObserver(self, selector: #selector(myFunc, name: NSNotification.Name(rawValue: "aNotificationName"), object: nil)
    

    在需要myFunc的VC4中:

    NotificationCenter.default.post(name: Notification.Name("aNotificationName"), object: nil)
    
  • 0

    您可以从导航堆栈中获取与第一个viewController具有相同类型的viewController,然后将其指定为vc4中的委托对象 .

    例如:在vc4的viewDidLoad中,您可以这样做

    for viewController in self.navigationController?.viewControllers{
    if viewController.isKindOfClass(YourVC1ControllerType){
        self.delegate = viewController
    }
    }
    

    我假设你的vc1,vc2,vc3等有自己的ViewController自定义类 .

    另一种实现方法是从self.navigationController?.viewControllers数组中获取第一个控制器,并将其设置为vc4中的委托对象 .

    //In viewDidLoad of vc4
     delegate = self.navigationController?.viewControllers.first as! HomeController
    

    要么,

    //In viewDidLoad of vc4
     delegate = self.navigationController?.viewControllers.[indexOfTheController] as! HomeController
    

相关问题