【问题标题】:call IBOutlet UIButton from one class to another Viewcontroller从一个类调用 IBOutlet UIButton 到另一个 Viewcontroller
【发布时间】:2017-12-13 17:57:27
【问题描述】:

我有一个名为 dataviewcontroller 的视图控制器。另一个名为 scopeviewcontroller 的视图控制器

dataviewcontroller 中,我有一个IBOutletUIButton 称为AddData。我想在我的scopeviewcontroller 中调用此按钮。我想隐藏那个按钮。

我在pager 中使用了这个视图控制器。我想在第三页的scopeviewcontroller 中隐藏AddData 按钮。

我在viewdidload 中的scopeviewcontroller 中尝试了此代码。

但是我得到这个错误: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

    }


}

请帮帮我!...谢谢

【问题讨论】:

  • 将此行更改为 let controller = storyboard.instantiateViewController(withIdentifier: "dataviewcontroller") 为 et controller = storyboard.instantiateViewController(withIdentifier: "dataviewcontroller") 为?数据视图控制器
  • 您需要明确提及它是哪种类类型。否则,默认情况下,它将作为 UIViewController。
  • 另一个警告。如果您正在实例化 viewController 意味着您正在为视图控制器创建新的状态对象,该对象具有自己的元素状态。现在根据您的要求思考。
  • @hybrid Dev 查看下面的答案,如果您有任何困惑,请告诉我...

标签: ios swift uiviewcontroller uibutton


【解决方案1】:

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

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

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

并实现协议CAPSPageMenuDelegate

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

【讨论】:

    【解决方案2】:

    出口不实例化,因为出口是一个变量(或属性)。

    nib 中的对象在加载该 nib 时被实例化,并在创建对象之后但在 awakeFromNib 发送到所有相关对象之前尽快将它们分配给每个出口。

    查看 Peter Hosey here 的回答以获取详细说明。

    在您的情况下,您可以将 bool var 从 scopeviewcontroller 传递到 dataviewcontroller。根据条件,您可以将dataviewcontrollerviewDidLoadviewDidAppear 中的AddData 按钮隐藏属性设置为true 或false。

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

    【讨论】:

    • 关于 ib 网点没有被实例化的很好的解释。另一种选择是仅以编程方式创建按钮,以便在实例化视图控制器时创建它。在您的自定义视图控制器中执行一个 `let button: UIButton = { return UIButton()}() ,您可以通过这种方式访问​​它。
    【解决方案3】:

    您必须从UIViewController 中键入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第二个代码在viewDidAppearviewDidLoad in dataviewcontrolleris 就像 luckyShubhra 所说的那样:

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

    【讨论】:

    • 它迫使我从 hidden 更改为 isHidden = true...但是当我这样做时...它在那条线上崩溃了
    • 我只得到这个(lldb)
    • 但是我没有使用任何 push 或模型 seague 来传递视图控制器.. 我正在使用 `let pageMenu: CAPSPageMenu! = CAPSPageMenu(viewControllers:controllerArray,frame:CGRect(x:0.0,y:0.0,width:self.view.frame.width,height:self.view.frame.height),pageMenuOptions:参数)`..我该怎么做将布尔值传入其中
    • 简单,如果你在dataviewcontroller中没有任何决定权,你可以通过全局变量来控制bool
    • 您能否在代码示例中解释一下...关于如何在dataviewcontroller 中为该按钮进行全局声明以及如何在我的scopeviewcontroller 中调用它...这将更有帮助
    【解决方案4】:

    在scopeviewcontroller 中创建dataviewcontroller 对象。 例如。 var dataVCObj = DataViewController(); 与使用对象 dataVCObj 相比,您可以访问按钮的 iboutlet。 例如。 dataVCObj.AddData

    【讨论】:

    • 当我在视图中这样调用时它崩溃了'dataVCObj.AddData.ishidden = true`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多