Swift 中的条形按钮项启用问题

Posted

技术标签:

【中文标题】Swift 中的条形按钮项启用问题【英文标题】:Bar button Item enabling problems in Swift 【发布时间】:2015-06-05 10:56:54 【问题描述】:

全部,

在 ViewDidLoad 中,我设置了:

BarButtonPAY.enabled = false

这会禁用条形按钮项目并且它是不可选择的,这很好。

我在 View Controller 上有一个计算属性,它使用 enable = true 启用按钮。

我收到错误“在可选值中找到 nil”,我注意到 BarButtonItem 是可选的。当我把 ?在变量的末尾它仍然没有启用。有任何想法吗 ?

class ViewController: UIViewController 

    @IBOutlet weak var BarButtonPAY: UIBarButtonItem!

    var PayButton : Int 
        didSet 
                println("Barracuda")
                    BarButtonPAY?.enabled = true
        
    

我现在在视图控制器中设置了不同的计算属性 - 就像这样(从 init 中删除了 var)。

@IBOutlet weak var BarButtonPAY: UIBarButtonItem!

    var PayButton : Int? 
        didSet 
            println("Barracuda")
            BarButtonPAY?.enabled = true
        
    


    required init(coder aDecoder: NSCoder) 
      //  self.PayButton = 0
        super.init(coder: aDecoder)
    

    init() 
       // self.PayButton = 0
        super.init(nibName: nil, bundle: nil)

    

当在 tableview 单元格上按下按钮时。选择产品,并将支付按钮突出显示为 BarButtonItem :

@IBAction func SelectedButton(sender: UIButton) 


    // Set the colours and then highlight 'Next' on
    sender.backgroundColor = UIColor.blueColor()
    sender.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
    sender.setTitle("Ordered", forState: UIControlState.Normal)

    let test = ViewController()
    test.PayButton = 2


【问题讨论】:

似乎很合理,我该如何解决?该按钮在界面生成器中设置。我在视图控制器上有一个容器(里面有一个表格视图),当在单元格上按下一个按钮时,它应该调用这个计算机变量(它确实如此)。 您可以先在设置计算属性的位置显示您的代码并显示视图控制器。 我认为按钮来自故事板,检查按钮连接(委托)故事板到 ViewController 并在代码 BarButtonPAY!.enabled = true 中使用它 仍然,在显示视图控制器的位置添加代码并访问PayButton 属性。 【参考方案1】:

由于 PayButton 不是可选属性,我假设您在初始化 BarButtonPAY 之前在初始化程序中设置它的值。尝试将默认值设置为 PayButton

var PayButton : Int = -1 
    didSet 
            println("Barracuda")
                BarButtonPAY?.enabled = true
    

或将其声明为可选 Int

var PayButton : Int? 
    didSet 
            println("Barracuda")
                BarButtonPAY?.enabled = true
    

并在两种情况下在 init 上设置其值时删除该行

编辑

即使在let test = ViewController() BarButtonPAY 中创建对象类型的 ViewController 后,也没有初始化(直到 ViewController viewDidLoad 方法才能使用它)。一种可能的解决方法:在 ViewController 中创建另一个可选的 Integer 属性并将其命名为 initialValue。在 selectedButton 上设置 initialValue 如下

@IBAction func SelectedButton(sender: UIButton) 


// Set the colours and then highlight 'Next' on
sender.backgroundColor = UIColor.blueColor()
sender.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
sender.setTitle("Ordered", forState: UIControlState.Normal)

let test = ViewController()
test.initialValue = 2


然后在 ViewController viewDidLoad 中将 PayButton 设置为 initialValue

override func viewDidLoad()

    PayButton = initialValue

【讨论】:

我把init里面的var去掉了直接加-1还是不行 其他地方设置在哪里? 也许你是在 RootViewController 的 prepareForSegue 中设置的? 那么您确定 BarButtonPAY 已从情节提要正确连接(检查参考插座)吗?当您设置 PayButton 一个值(在您的代码中的任何位置)时,请您给我看代码 让我们continue this discussion in chat。【参考方案2】:

当您这样做let test = ViewController() 时,您正在创建视图控制器的新实例。这样您的网点将是nil。尝试从情节提要访问您的视图控制器:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier("yourViewController") as! UIViewController
self.presentViewController(viewController, animated: true, completion: nil)

然后访问属性:

viewController.PayButton = 2

【讨论】:

这不起作用,因为我用来向 PayButton 添加值的类没有 ViewController 委托,因此 'presentViewController' 无效。 我同意对象已超出视图层次结构 - 我只需要以对象不会消失的方式连接到视图控制器。

以上是关于Swift 中的条形按钮项启用问题的主要内容,如果未能解决你的问题,请参考以下文章

条形按钮导航控制器隐藏 Swift

当所有文本字段都填写在uitableviewcell(SWIFT)中时如何启用按钮

仅当所有文本字段都已填写时才在 Swift 中启用按钮

Swift 4 - 如何使用按钮启用/禁用键盘

开始和暂停按钮启用/禁用 swift

Eureka Forms Swift 启用和禁用按钮