Ios 从一个类调用IBUIButton到另一个Viewcontroller
我有一个名为Ios 从一个类调用IBUIButton到另一个Viewcontroller,ios,swift,uiviewcontroller,uibutton,Ios,Swift,Uiviewcontroller,Uibutton,我有一个名为dataviewcontroller的视图控制器。另一个名为scopeviewcontroller 在dataviewcontroller中,我有一个名为AddData的IBOutlet的ui按钮。我想在scopeviewcontroller中调用此按钮。我想把那个按钮藏起来 我在我的系统中使用过这个视图控制器。我想在第三页显示的scopeviewcontroller中隐藏AddData按钮 我在我的scopeviewcontroller中的viewdidload中尝试了此代码 但是
dataviewcontroller
的视图控制器。另一个名为scopeviewcontroller
在dataviewcontroller
中,我有一个名为AddData
的IBOutlet
的ui按钮。我想在scopeviewcontroller
中调用此按钮。我想把那个按钮藏起来
我在我的系统中使用过这个视图控制器。我想在第三页显示的scopeviewcontroller
中隐藏AddData
按钮
我在我的scopeviewcontroller
中的viewdidload
中尝试了此代码
但是我得到了这个错误:类型为“UIViewController”的值没有成员“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
}
}
请帮帮我!。。。谢谢您必须从UIViewController
中键入Castdataviewcontroller
,因为默认情况下它将返回到没有AddData
按钮的父类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和第二个在数据视图控制器中的viewdide出现或viewdideload
中写入代码,就像luckyShubhra告诉:
class dataviewcontroller: UIViewController {
@IBOutlet var AddData: UIButton!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.AddData.hidden = needHideAddData
}
}
出口不会实例化,因为出口是变量(或属性)
nib中的对象在加载该nib时被实例化,并在创建对象之后,但在将awakeFromNib发送到所有相关对象之前,尽可能立即将其分配给每个出口
查看Peter Hosey的ans以了解详细解释
在本例中,您可以将bool
var从scopeviewcontroller
传递到dataviewcontroller
。根据条件,您可以在dataviewcontroller
的viewdiload
或viewdispect
中设置AddData
按钮隐藏属性true或false
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.AddData.hidden = true
}
在scopeviewcontroller中创建dataviewcontroller的对象。
例如var dataVCObj=DataViewController()强>
与使用对象dataVCObj相比,您可以访问按钮的iboutlet。
例如dataVCObj.AddData您无需访问在寻呼机上添加的每个视图控制器上的按钮。您可以隐藏scopeviewcontroller
本身上的按钮。在capspagemenudegate
extension scopeviewcontroller: CAPSPageMenuDelegate {
func willMoveToPage(_ controller: UIViewController, index: Int) {
self.AddData.isHidden = (index == 2)
}
}
在ScopeViewController中,设置寻呼机的代理
fun viewDidLoad() {
super.viewDidLoad()
pageMenu.delegate = self
}
并实现协议capspagemenudegate
extension scopeviewcontroller: CAPSPageMenuDelegate {
func willMoveToPage(_ controller: UIViewController, index: Int) {
self.AddData.isHidden = (index == 2)
}
}
将此行let controller=storyboard.instanceeviewcontroller(带标识符:“dataviewcontroller”)更改为et controller=storyboard.instanceeviewcontroller(带标识符:“dataviewcontroller”)为?DataViewControllery您需要明确说明它是哪种类类型。否则,默认情况下,它将作为UIViewController。另一个警告。若您正在实例化viewController,则表示您正在为视图控制器创建新的状态对象,该视图控制器的元素有自己的状态。现在根据您的要求思考。@hybrid Dev检查下面的答案,如果您有任何困惑,请告诉我…它迫使我从隐藏更改为ishiden
=true…但是当我这样做时…它在这条线上崩溃了我只得到了这条(lldb)
但我没有使用任何推送或模型导航通过视图控制器。。我正在使用'let pageMenu:CAPSPageMenu!=CAPSPageMenu(ViewController:controllerArray,frame:CGRect(x:0.0,y:0.0,width:self.view.frame.width,height:self.view.frame.height),pageMenuOptions:parameters)`..如何在其简单中传递布尔值,如果在dataviewcontroller
中无法做出决定,您可以通过生成全局变量来控制bool。您可以在代码示例中解释一下……如何在dataviewcontroller
中为该按钮进行全局声明,以及如何在我的scopeviewcontroller
中调用它。这样会更有帮助当我在视图中这样调用时崩溃,加载了'dataVCObj.AddData.ishiden=true',这是关于ib出口未被实例化的很好的解释。另一种方法是通过编程方式创建按钮,以便在视图控制器实例化时创建它。在自定义视图控制器内执行`let button:UIButton={return UIButton()}(),您就可以通过这种方式访问它。