Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从一个类调用IBUIButton到另一个Viewcontroller_Ios_Swift_Uiviewcontroller_Uibutton - Fatal编程技术网

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
中键入Cast
dataviewcontroller
,因为默认情况下它将返回到没有
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()}(),您就可以通过这种方式访问它。