从一个类调用IBOutlet UIButton到另一个Viewcontroller

我有一个视图控制器称为scopeviewcontroller 。另一个视图控制器称为scopeviewcontroller

dataviewcontroller我有一个名为AddDataUIButtonIBOutlet 。我想在我的scopeviewcontroller调用这个button。 而我想隐藏那个button。

我在寻呼机中使用了这个视图控制器。 我想隐藏AddDatabutton在我的scopeviewcontroller中出现在第三页。

我在我的scopeviewcontroller viewdidload中试过这段代码。

但是得到这个错误: Value of type 'UIViewController' has no member 'AddData'

我的代码在第一视图控制器:

 class dataviewcontroller: UIViewController { @IBOutlet var AddData: UIButton! } 

我的第二视图控制器:

 class scopeviewcontroller: UIViewController,UITableViewDelegate, UITableViewDataSource { override func viewDidLoad() { super.viewDidLoad() let storyboard = UIStoryboard(name: "data", bundle: nil) let controller = storyboard.instantiateViewController(withIdentifier: "dataviewcontroller") controller.AddData.hidden = true } } 

请帮助我!谢谢

您无需访问您在寻呼机上添加的每个视图控制器上的button。 你可以隐藏scopeviewcontroller本身的button。 在CAPSPageMenuDelegate的帮助下

在ScopeViewController中,设置你的寻呼机的委托。

 fun viewDidLoad() { super.viewDidLoad() pageMenu.delegate = self } 

并实现协议CAPSPageMenuDelegate

 extension scopeviewcontroller: CAPSPageMenuDelegate { func willMoveToPage(_ controller: UIViewController, index: Int) { self.AddData.isHidden = (index == 2) } } 

sockets不会实例化,因为sockets是variables(或属性)。

当nib被加载时,nib中的对象被实例化,并且在创build对象之后但在awakeFromNib被发送给所有相关对象之前,它们被尽可能立即分配给每个出口。

在这里查看Peter Hosey的答案以获得详细的解释。

在你的情况下,你可以从scopeviewcontroller传递一个bool scopeviewcontrollerscopeviewcontroller 。 根据条件,您可以在AddDataviewDidLoadviewDidAppear AddDatabutton的隐藏属性设置为true或false。

  override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.AddData.hidden = true } 

你必须从UIViewControllertypes转换dataviewcontroller ,因为默认情况下,它将返回到没有AddDatabutton的父类UIViewController对象,你必须这样做: –

 var needHideAddData = true class scopeviewcontroller: UIViewController,UITableViewDelegate, UITableViewDataSource { override func viewDidLoad() { super.viewDidLoad() let storyboard = UIStoryboard(name: "data", bundle: nil) let controller = storyboard.instantiateViewController(withIdentifier: "dataviewcontroller") as! dataviewcontroller controller.AddData.hidden = true } } 

注意

基本上,在初始化UIViewController nib之前不会被访问,所以在加载完nib之后,引用和内存将被分配给IBOutlet,所以你只有两种方法来实现:

1: –默认情况下,你必须隐藏它,当你需要取消隐藏时,你可以控制在dataviewcontroller viewDidLoad方法。

2第二个在viewDidAppearviewDidLoad中写入代码在dataviewcontrolleris中像luckyShubhra一样告诉:

 class dataviewcontroller: UIViewController { @IBOutlet var AddData: UIButton! override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.AddData.hidden = needHideAddData } } 

在scopeviewcontroller中创builddataviewcontroller的对象。 例如。 var dataVCObj = DataViewController(); 比使用对象dataVCObj,你可以访问button的iboutlet。 例如。 dataVCObj.AddData